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.
题目意思是求给定二叉树的最小公共祖先,不同于二叉搜索树,二叉树没有左节点小于根节点,右节点大于根节点的特性。
思路是记录每个节点的深度(depth)和该节点的双亲节点(parent),再把要求的两个节点p,q向上寻找共同的祖先直到parent[p]==parent[q]。
遍历整个二叉树时用到了深搜(dfs)的思想。
/**
* 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* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
unordered_map(TreeNode*,int) depth;//记录每个节点的深度(这里定义根节点深度为0)
unordered_map(TreeNode*,TreeNode*) parent;//记录每个节点的双亲节点
dfs(root,NULL,0,depth,parent);
if(depth[p]<depth[q])//如果p节点深度小于q(说明p比q跟靠近根节点)
swap(p,q);
int d=depth[p]-depth[q];
for(int i=0;i<d;i++)
p=parent[p];//这里是不断让p等于它的双亲节点,使p,q在同一深度上
while(p!=q){
p=parent[p];
q=parent[q];
}
return p;
}
void dfs(TreeNode* node,TreeNode* p,int d,unordered_map<TreeNode*,int> &depth,unordered_map<TreeNode*,TreeNode*> &parent){//记得传入要传引用
if(!node)return ;
depth[node]=d;
parent[node]=p; //p表示在深搜时node的双亲节点
dfs(node->left,node,d+1,depth,parent);
dfs(node->right,node,d+1,depth,parent);
}
};