问题描述:
给定一个二叉树,找到该树中两个指定节点的最近公共祖先。
问题分析:
我们可以将这两个节点的所处位置进行分类:p、q节点是否处于同一颗子树中。
【1】从根节点进行遍历,递归向左右查询节点信息;
【2】递归的终止条件:如果当前节点为空或者为p、q节点,则返回当前节点
(1)递归遍历左右子树,如果左右子树查到节点都为非空,说明p、q分别在左右子树中,当前节点即为最近的公共祖先;
(2)如果左右子树其中一个不为空,则返回非空节点。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == NULL)
return NULL;
if(root == p || root == q)
return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q); //保存左子树结果
TreeNode* right = lowestCommonAncestor(root->right, p, q); //保存右子树结果
if(left == NULL) //如果左子树没有公共祖先,返回right节点
return right;
if(right == NULL) //如果右子树没有公共节点,则返回left节点
return left;
if(left && right) // p和q在两侧
return root;
return NULL; // 必须有返回值
}
};