30 Day Challenge Day 7 | Leetcode 235. Lowest Common Ancestor of a Binary Search Tree

题解

方法:DFS Search

找两个节点的最低祖宗节点,想到用深度优先搜索,先找到从根节点到达该节点的路径,然后遍历两条路径,找到最低的共同祖宗节点。可以通过测试。

然后后来发现我把问题复杂化了,忽略了题目中的条件,“平衡二叉树”,也就是说,节点是有顺序的,而我完全没有用上。

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        vector<TreeNode*> arr1, arr2, ret1, ret2;
        search(root, p, arr1, ret1);
        search(root, q, arr2, ret2);

        int i = 0;
        while(i < ret1.size() && i < ret2.size() && ret1[i] == ret2[i]) {
            i++;
        }
        if(i > 0) i--;

        return ret1[i];
    }
    
    void search(TreeNode* node, TreeNode* t, vector<TreeNode*>& arr, vector<TreeNode*>& ret) {
        if(!node) return;

        arr.push_back(node);

        if(node == t) {
            for(auto n : arr) {
                ret.push_back(n);
            }
            return;
        }

        if(node->left) search(node->left, t, arr, ret);
        if(node->right) search(node->right, t, arr, ret);

        arr.pop_back();
    }
};

方法:平衡二叉树搜索

这里while的判断条件设置地很巧妙,只需要判断与root的值的差是不是同为正或同为负,那么就可以知道,p和q是不是都在root左边或者右边。如果不是,无论是等于0的情况还是,小于0的情况,都找到了共同祖先。

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        while((root->val - p->val)*(root->val - q->val) > 0) {
            root = (root->val > p->val) ? root->left : root->right;
        }
        return root;
    }
};
上一篇:S - Lowest Common Multiple Plus 求n个数的最小公倍数


下一篇:236.Lowest Common Ancestor of a Binary Tree