1. 程式人生 > 實用技巧 >【leetcode】二叉樹的最近公共祖先

【leetcode】二叉樹的最近公共祖先

/**
 * 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; }