题目描述:
给定一颗二叉树,找到该树中两个指定节点的最近公共祖先
思路:利用递归,在左子树和右子树中分别找
Node * find(Node * root, Node *p){
if (root == NULL){
return NULL;
}
if (root == p){//找两个节点的地址
return p;
}
Node *result = find(root->left, p);
if (result != NULL){//在左子树里面找到了
return result;
}
return find(root->right,p);//如果没找到就在右子树里面去找
}
Node * lowestCommonAncestor(Node *root, Node *p, Node *q){
if (root == p || root == q){//如果q或者p为根了
return root;
}
Node *pInLeft = find(root->left, p);
Node *qInLeft = find(root->left, q);
if (pInLeft != NULL&&qInLeft != NULL){//都在左子树里面
return lowestCommonAncestor(root->left, p, q);
}
if (pInLeft == NULL&&qInLeft == NULL){//左子树里面找不到,就去右子树里面找
return lowestCommonAncestor(root->right, p, q);
}
return root;//如果都找不到,说明一个在左,一个在右,则最近的祖先就是根节点
}