[基礎二叉樹算法]求兩個節點的最近公共祖先

先定義數據結構算法

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
  • 找4和9.

當函數遞歸到root=2的時候,遞歸

left進去4開始找,找到return 4.
 right進去5開始找,最終找到9,return 9。

此時root=2的時候,left和right都有值。return 2.數據

  • 找4和7
當函數遞歸到root=1的時候,     
  left進去,2開始找,最終return 4     
  right進去,3開始找,最終return 7
此時root=1的時候,left和right都有值,return1.
  • 找4和8,

當函數遞歸到root=4的時候,co

left進去,直接return 4.
  right進去,return null。

此時因爲只找到了4,return 4.
再往回return的時候,root = 2時,left = 4.return 4.
往回 root = 1 時,left = 4,block

right = null, 故最終return 4.
相關文章
相關標籤/搜索