Leetcode典型题解答和分析、归纳和汇总——T236(二叉树的最近公共祖先)

问题描述:

给定一个二叉树,找到该树中两个指定节点的最近公共祖先。

问题分析:

我们可以将这两个节点的所处位置进行分类: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; // 必须有返回值
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章