Lowest Common Ancestor of a Binary Tree
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.
按照题目的说法,这就是一个LCA(最小公共祖先)的裸题。可以算是经典题目了。
抛开那些套路般的算法(下面会详细介绍)模板,这个题目也是可以做的。注意到它只是进行了一次询问,所以会比较好考虑。
注意到这样几点(假设所求节点为p和q):
- 如果节点node为p和q的LCA的话,node的所有祖先都会是p和q的公共祖先
- 对于节点p和q来说,设他们的LCA为r,则要么p和q其中一个为r,要么他们分别处于r的左子树和右子树。
所以如果采用DFS(后序遍历)的搜索方式,一旦判断到某个节点符合上面第二条的性质,那么就能马上肯定这个节点就是所求LCA。复杂度不难分析,O(N)
对应代码如下:
/** * 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: TreeNode *pp = NULL; TreeNode *qq = NULL; TreeNode *lca = NULL; void dfs(TreeNode *root, TreeNode *p, TreeNode *q) { if (lca != NULL) return; if (root->left != NULL) { dfs(root->left, p, q); if (pp == root->left) pp = root; if (qq == root->left) qq = root; } if (root->right != NULL) { dfs(root->right, p, q); if (pp == root->right) pp = root; if (qq == root->right) qq = root; } if (lca != NULL) return; if (root == p) pp = root; if (root == q) qq = root; if (pp != NULL && qq != NULL && pp == qq) lca = root; } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { dfs(root, p, q); return lca; } };
时间: 2024-10-06 00:55:47