求二叉樹中兩個節點的最近公共祖先結點

2021-08-04 13:32:05 字數 2795 閱讀 4471

1、原理:二叉搜尋樹是排序過的 ,位於左子樹的結點都比父結點小,位於右子樹的結點都比父結點大,我們只需從根節點開始和兩個輸入的結點進行比較,如果當前節點的值比兩個結點的值都大,那麼最低的公共祖先結點一定在該結點的左子樹中,下一步開遍歷當前結點的左子樹。如果當前節點的值比兩個結點的值都小,那麼最低的公共祖先結點一定在該結點的右子樹中,下一步開遍歷當前結點的右子樹。這樣從上到下找到第乙個在兩個輸入結點的值之間的結點。

2、實現**

binarynode* createbinarytree(int* array, int length)

else if (array[idx]>pcur->_value)

else

return null;

} //插入元素

pcur = new binarynode(array[idx]);

if (array[idx] < ptemp->_value)

ptemp->_left = pcur;

else

ptemp->_right = pcur;

} return root;

}//搜素二叉樹尋找最近公共祖先節點

binarynode* ancestortreenode(binarynode* proot, binarynode* node1, binarynode* node2)

return null;

}

測試用例:

void funtest1()

; int length = sizeof(array) / sizeof(array[0]);

proot = createbinarytree(array, length);

binarynode* node1 = proot->_left->_left;

binarynode* node2 = proot->_left->_right;

binarynode* pnode = ancestortreenode(proot, node1, node2);

if (pnode)

cout << pnode->_value << endl;

}

1、原理:如果樹中每個結點都有父結點(根結點除外),這個問題可以轉換成求兩個鍊錶的第乙個公共結點,假設樹結點中指向父結點的指標是parent,樹的每乙個葉結點開始都由乙個指標parent串起來的鍊錶,每個鍊錶的尾結點就是樹的根結點。那麼輸入的這兩個結點位於鍊錶上,它們的最低公共祖先結點剛好是這兩個鍊錶的第乙個公共結點。

2、實現**

int hight(binarynode* root, binarynode* node)

return len;

}binarynode* getlastcommonancestor(binarynode* root, binarynode* node1, binarynode* node2)

while (node1 && node2 && node1 != node2)

if (node1 == node2)

return node1;

else

return null;

}

測試用例

void funtest()

else

q.push(cur);

} }binarynode* node1 = root->_left->_left;

binarynode* node2 = root->_left->_right;

binarynode* ancestor = getlastcommonancestor(root, node1, node2);

if (ancestor)

cout << ancestor->_value << endl;

else

cout << "沒有公共祖先" << endl;

}

1、原理:在二叉樹根結點 的左子樹和右子樹中分別找輸入的兩個結點,如果兩個結點都在左子樹,遍歷當前結點的左子樹,如果兩個結點都在右子樹,遍歷當前結點的右子樹,直到乙個在當前結點的左子樹,乙個在當前結點的右子樹,返回當前結點就是最低的公共祖先結點。

2、實現**

bool isnodeintree(binarynode* proot, binarynode* pnode)

binarynode* getcommonancestor(binarynode* proot, binarynode* node1, binarynode* node2)

測試用例

void funtest3()

else

q.push(cur);

} }binarynode* node1 = root->_left->_left;

binarynode* node2 = root->_left->_right;

binarynode* ancestor = getcommonancestor(root, node1, node2);

if (ancestor)

cout << ancestor->_value << endl;

else

cout << "沒有公共祖先" << endl;

}

標頭檔案和結點的結構體

#include#includeusing namespace std;

struct binarynode

};

求二叉樹中兩個節點的最近公共祖先

比如 在如圖這棵二叉樹中,8和9的公共祖先是1,4和5的公共祖先是2,5和2的公共祖先是2。在上述分析中,我們可以得出思路,本題解法可分為兩種情況,1 兩個節點在根節點同側 則它們的最近公共祖先可能是其中乙個節點,也可能是在到兩個節點的公共路徑上。2 兩個節點在根節點的不同側,則它們的公共祖先只能是...

求二叉樹中兩個節點的最近公共祖先

要求考慮以下三種種情況,給出解決方案,並解決 1 二叉樹是搜尋二叉樹。2 二叉樹每個節點有parent 三叉鏈 treenode publiclowparent treenode root,treenode c1,treenode c2 else if c1 data cur data c2 dat...

求二叉樹兩個節點的最近公共祖先

偶然看到乙個特別特別巧妙的方法,在此記錄一下 typedef struct xbnodexbnode,xbtree 取名叫xbtree是因為以為這個是線索二叉樹 記住!這個不是線索二叉樹,線索二叉樹是儲存了前驅和後繼的指標,包括前序線索二叉樹 中序線索二叉樹和後序線索二叉樹三種。由於建立的時候多了乙...