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.
大意:給一個二叉樹,給出樹中的兩個節點,讓你找出這兩個節點最近的公共祖先。
兩種方法,一種是分兩次遍歷樹,第一次遍歷,找到從root到P的路徑,放入一個vector或數組中。第二次遍歷找到從root到Q的路徑,放入一個vector或數組中。然後同時遍歷vector,找到他們最後一個相同的節點,則那個節點就是他們的最近公共祖先。
還有一個方法就是遞歸。因爲樹的遞歸定義,所以很多問題可以轉換爲樹的遞歸方法來做。基準情況爲root==null,或者p或者q中有一個是root,則返回null,否則p,q在不同的分支,因此分別遞歸左右節點。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {
if(root == NULL || p == root || q == root)
return root;
struct TreeNode *left = lowestCommonAncestor(root->left,p,q);
struct TreeNode *right = lowestCommonAncestor(root->right,p,q);
if(left && right)
return root;
return (left != NULL) ? left:right;
}