[Leetcode] #236 Lowest Common Ancestor of a Binary Tree

Discription

Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

        _______3______
       /              \
    ___5__          ___1__
   /      \        /      \
   6      _2       0       8
         /  \
         7   4

For example, the lowest common ancestor (LCA) of nodes 5 and 1 is 3. Another example is LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself 

Solution

用两个数组分别存从根结点到输入的两个结点的路径,然后把问题转换成两个链表的最后公共结点。下面为两种写法,第一种找到路径就能退出,而第二种将所有路径搜索一遍,将符合要求的存下来。

class Solution {
public:
    bool getPath(TreeNode* root, TreeNode* node, vector<TreeNode*> &path) {
        if (root == node) {
            path.push_back(root);
            return true;
        }
        path.push_back(root);
        if (root->left && getPath(root->left, node, path) ||
            root->right && getPath(root->right, node, path))
            return true;
        path.pop_back();
        return false;
    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (!root || !p || !q) return NULL;
        vector<TreeNode*> path1;
        vector<TreeNode*> path2;
        getPath(root, p, path1);
        getPath(root, q, path2);

        TreeNode *plast = NULL;
        for (int i = 0; i<path1.size() && i <path2.size(); i++) {
            if (path1[i] == path2[i])
                plast = path1[i];
            else
                break;
        }
        return plast;
    }
};
class Solution {
public:
    vector<TreeNode*> temp;
    void getPath(TreeNode *root, TreeNode *p, vector<TreeNode*> &path) {
    	if (root == p) {
            path = temp;
            return;
        }
        temp.push_back(root);
        if (root->left)
            getPath(root->left, p, path);
        if (root->right)
            getPath(root->right, p, path);
        temp.pop_back();
    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        vector<TreeNode*> pathp, pathq;
        getPath(root, p, pathp);
        temp.clear();
        getPath(root, q, pathq);
        int i = 1;
        while (i<pathp.size() && i<pathq.size()) {
            if (pathp[i] != pathq[i])
                break;
            i++;
        }
        return pathp[i - 1];
    }
};

下面解法不是很懂,先记录下来。

class Solution {
public:
	TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
		if (root == NULL) return NULL;
		if (root == p || root == q) return root;
		TreeNode* l1 = lowestCommonAncestor(root->left, p, q);
		TreeNode* l2 = lowestCommonAncestor(root->right, p, q);
		if (l1 != NULL && l2 != NULL) return root;
		return l1 == NULL ? l2 : l1;
	}
};
GitHub-Leetcode: https://github.com/wenwu313/LeetCode
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值