在二元搜尋樹中,有這麼一個經典的題目:尋找兩節點的共同祖先!
但是共同祖先可以有很多個,所以我們會選擇最接近的共同祖先作為這題的輸出。
那要怎麼實作呢?
BSTNode *BST::lowestCommonAncestor(BSTNode *root, BSTNode *tg1, BSTNode *tg2);
右子節點資料 > 根節點資料
且 左子節點資料 < 根節點資料
cur
為當前節點)
cur -> data
> tg1 -> data
&& cur -> data
> tg2 -> data
cur
的左子樹中存在 tg1
, tg2
的共同祖先cur -> data
< tg1 -> data
&& cur -> data
< tg2 -> data
cur
的右子樹中存在 tg1
, tg2
的共同祖先tg2 -> data
> cur -> data
> tg1 -> data
or tg2 -> data
< cur -> data
< tg1 -> data
cur
為 tg1
, tg2
的 lowestCommonAncestortg1 == cur
or tg2 == cur
:
cur
註:LCA 為 Lowest Common Ancestor 的縮寫
BSTNode* BST::LCA(BSTNode *root, BSTNode *tg1, BSTNode *tg2) {
if (root == NULL) return NULL;
if (tg1 == root || tg2 == root)
return root;
if ((root -> data > tg1 -> data && root -> data < tg2 -> data) || (root -> data < tg1 -> data && root -> data > tg2 -> data))
return root;
else if (root -> data > tg1 -> data && root -> data > tg2 -> data)
return lowestCommonAncestor(root -> left, tg1, tg2);
else
return lowestCommonAncestor(root -> right, tg1, tg2);
}
不覺得遞迴很方便嗎?
但是前提是我們必須找出規則、理清頭緒。