問題描述:
給定一個二叉樹,找到該樹中兩個指定節點的最近公共祖先。
問題分析:
我們可以將這兩個節點的所處位置進行分類: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; // 必須有返回值
}
};