leetCode(39):Lowest Common Ancestor of a Binary Tree

来源:互联网 发布:域名dns查询 编辑:程序博客网 时间:2024/05/21 06:17

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 according to the LCA definition.

首先找出自根结点到两个结点的路径,并保存,然后找这两条路径最后一个相同的结点

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    bool getPath(TreeNode* root, TreeNode* node, list<TreeNode*>& path)    {    if (root == node)    {    path.push_back(root);    return true;    }    path.push_back(root);        TreeNode* tmp = root;        bool found_left = false;    bool found_right = false;        if (tmp->left)    found_left = getPath(tmp->left, node, path);    if (!found_left && tmp->right)    {//右子树中没有则在其左子树中寻找    found_right = getPath(tmp->right, node, path);    }        if (!found_left && !found_right)//左右子树中都未找到,则路径错误    path.pop_back();        return found_left || found_right;//返回查找结果    }    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {        if (root == NULL)    return NULL;    list<TreeNode*> path1, path2;    getPath(root, p, path1);    getPath(root, q, path2);    list<TreeNode*>::iterator iter1, iter2;    iter1 = path1.begin();    iter2 = path2.begin();    TreeNode* plast=NULL;    while (iter1 != path1.end() && iter2 != path2.end())    {    if (*iter1 == *iter2)    {//查找最后一个相同的结点,在此之前,都是相同的    plast = *iter1;    }    iter1++;    iter2++;    }    return plast;    }};



0 0
原创粉丝点击