【leetcode】二叉樹的最近公共祖先
阿新 • • 發佈:2020-08-24
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/*
對於一個公共祖先(一定有子節點才能當祖先)來說,其兩個子節點 p、q 有三種分佈情況
1 p, q 分別位於 x 的左子樹和右子樹;
2 p, q 都在 x 的左子樹(也包括祖先其自身,另一個位元組點在左子樹);
3 p, q 都在 x 的右子樹(也包括祖先其自身,另一個位元組點在右子樹);
上述3條規律對每一子樹都成立, 所以只要檢查每個節點的 左右子樹即可, 所以要用後續遍歷
*/
int flagP = 0;
int flagQ = 0;
struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {
if (!root){
return NULL;
}
if (root == p || root == q){
return root;
}
struct TreeNode* left = lowestCommonAncestor(root -> left, p, q);
struct TreeNode* right = lowestCommonAncestor(root -> right, p, q);
if (left && right){ // p, q 分別位於 x 的左子樹和右子樹;
return root;
}else if (left){ // p, q 都在 x 的左子樹(也包括祖先其自身,另一個位元組點在左子樹);
return left;
}else if (right){ // p, q 都在 x 的右子樹(也包括祖先其自身,另一個位元組點在右子樹);
return right;
}
return NULL;
}