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; } };