先定義數據結構算法
typedef struct { int value; Node *left; Node *right; } Node;
算法:數據結構
void findCommonRoot(Node *root, Node *n1, Node *n2) { if (!root) { return NULL; } // 當前節點爲其中一個,直接return。 if (root == n1 || root == n2) { return root; } Node *left = findCommonRoot(root->left, n1, n2); Node *right = findCommonRoot(root->right, n1, n2); // 當前節點下,左右都能找到,則當前節點就是最近共同父節點。 if (left && right) { return root; } // 若是隻找到了一個,返回對應的那個。 if (left || right) { return left ? : right; } return NULL; }
舉個栗子:函數
好比下圖,code
1 2 3 4 5 6 7 8 9
當函數遞歸到root=2的時候,遞歸
left進去4開始找,找到return 4. right進去5開始找,最終找到9,return 9。此時root=2的時候,left和right都有值。return 2.數據
當函數遞歸到root=1的時候, left進去,2開始找,最終return 4 right進去,3開始找,最終return 7 此時root=1的時候,left和right都有值,return1.
當函數遞歸到root=4的時候,co
left進去,直接return 4. right進去,return null。此時因爲只找到了4,return 4.
再往回return的時候,root = 2時,left = 4.return 4.
往回 root = 1 時,left = 4,blockright = null, 故最終return 4.