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; // 必須有返回值
    }
};

 

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