求樹中兩個節點的最近公共祖先(版本2)

2021-08-01 06:10:29 字數 3486 閱讀 1699

1.求樹中兩個節點的最近公共祖先(版本2) 

我們來看 這個問題 的 第二種解析思路

在第一種思路中, 我們將 這個題意理解為,這棵樹是一顆二叉搜尋樹.

在第二種思路中, 我們將 這棵樹, 理解為一顆普通的樹, 或許它都不是二叉樹, 不過這不重要(不過為了方便測試, 我們將用結點中含有指向父節點指標的二叉樹進行測試  ---> 不過 ,這與用普同一棵樹進行測試並沒有本質的區別 )

在這次分析中, 我們假設 這顆樹的節點中 含有 指向 父節點的指標

我們的解法是這樣的:  我們借用兩個 輔助棧 s1 和 s2 來解決這個問題。 將兩個結點的 父節點分別 入 棧 s1 和 s2.  直到兩個結點 入棧的 最後乙個節點為 根節點(因為這兩個結點屬於 同一顆二叉樹, 所以它們的根節點是相同的)

現在我們來思考,1. 兩個棧 的棧頂 為同乙個根節點.  2. 二叉樹中 每個 結點 到根節點只有一條路徑

此時, 我們依次從棧中 pop 資料, 從棧中最後乙個 pop 的 相同的結點, 即為兩個結點的最近公共祖先( 其實這種想法我已經在 求兩個鍊錶的第乙個公共結點 這篇部落格中提過, 在那篇部落格中, 我們用三種方法來找到 兩個鍊錶的第乙個公共結點, 我們這裡所用的方法, 屬於 那篇部落格中的方法2, 如果看過那篇部落格即可知道, 其實最好的解法是那篇部落格中的方法3, 而不是我們現在所用的這種方法, 不過,那篇部落格中並未實現方法2的**, 為了實現一次這種**, 我們這裡採用方法2,在那篇部落格中已經提到, 方法2 相比 方法3, 時間複雜度相同, 但方法2的空間複雜度更大 )

不管做哪道題, 千萬不要忘了, **要考慮到 "空"的情況。  如空結點。

我們的二叉樹中 不包含數值相同的 結點

#include #include #include using namespace std;

#include "binarytree.h"

template binarytreenode* findfirstcommonnode( binarytreenode* node1, binarytreenode* node2 )

while ( null != node2parent )

binarytreenode* firstcommonnode = null;

只要我們所給的兩個結點在這同一顆二叉樹中, 則它們一定有乙個公共結點(即使為根節點)( 我們呼叫二叉樹的find( ) 函式, 來獲取兩個資料所屬的結點指標, 這樣也保證了, 我們的兩個節點指標一定是屬於 同一顆二叉樹的 。 我們這裡不考慮, 兩個節點指標分別屬於兩個二叉樹的情況 )

對於 c++標準庫 stl 中的棧 容器: 對 空棧的 top( ) 行為是未定義的

//while ( s1.top( ) == s2.top( ) ) //我們一定能執行這個 while迴圈 至少一次, 因為兩個結點的 根節點一定是相等的, 所以迴圈一開始一定能進去

// //注意 ,while 迴圈條件一定要寫的謹慎. 千萬別 犯 應該寫 == 卻寫了 != 的錯誤!

//這裡還有問題, 不能用 s1.top == s2.top 這個條件 --> 用例子中的 二 三 結點去判斷, 會觸發 空棧的 top( ) 行為, 程式會掛掉!

先給出實現**, 等到晚上  用 c++ 再 實現一次 包含find( )方法的 二叉樹。 且二叉樹結點中 包含指向父節點的_parent指標.

.h:

#include //一般即使在標頭檔案中也把 這個 加上吧, 否則 null 都用不了

template struct binarytreenode

};template class binarytree

binarytree( t* a, size_t n, const t& invalid = t( ) )//別忘了, 定義物件時, 是可以帶括號, 括號裡帶引數的呀, 建構函式嘛!

else

}//吶, 你看, 如果這樣寫(直接在裡面遞迴), 返回值沒辦法寫。 所以在它裡面, 需要再寫乙個子函式, 讓子函式去執行遞迴, 而不是它自己來執行遞迴.

//node* find( const t& x )

// node* find( const t& x )

private:

node* _root;

node* _find( node* root, const t& x )

//錯//node* _create( t* a, size_t n, const t& invalid, size_t& index )//前序遍歷 構建 結點含指向父節點指標的 二叉樹

// // return _root; //這樣寫是錯的(如果只有乙個 資料呢)

//}node* createtree( t* a, size_t n, const t& invalid, size_t& index, node* parent )

return root;

}};

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

原文 分三種情況 1 搜尋二叉樹,根據搜尋二叉樹的性質,左子樹的所有節點比根節點小,右子樹的所有節點比跟節點大。如果兩個節點都比根節點小,則遞迴左子樹 如果兩個節點都比跟節點大,則遞迴右子樹 否則,兩個節點乙個在左子樹,乙個在右子樹,則當前節點就是最近公共祖先節點。2 二叉樹有指向父節點的指標。問題...

找兩個節點的最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 分三種情況 如果這兩個節點其中乙個是根節點,直接返回根節點 如果乙個結點在左子樹,另乙個在右子樹,直接返回根節點 如果兩個都在左子樹或者都在右子樹上,直接使用...

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

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