如何判別是否同一棵二叉搜尋樹?

2021-08-20 03:56:56 字數 1798 閱讀 7412

對於乙個確定的線性序列,按順序插入序列可以確定一棵唯一的二叉搜尋樹,但是。一棵二叉搜尋樹卻可以有多種插入序列得到。例如序列1:

和序列2:

兩個序列插入初始為空的二叉搜尋樹中,得到的兩棵二叉搜尋樹是一樣的。所以,如何判斷兩棵或多棵二叉搜尋樹是否相同?

第一種方法很自然的我們就想到是兩棵樹做遍歷,比較每乙個結點,也就是用遞迴,一開始看根結點同不同,然後遞迴比較左子樹同不同,右子樹同不同,這樣的方法**和遍歷相似

判別是否同一棵二叉搜尋樹,我們還有其他方法,我們想象,之前講二叉樹的遍歷時,我們說二叉樹是二維的結構,而我們對二叉樹的遍歷是把二叉樹變成一維的線性的序列結構。從這裡我們可以得到啟示,對二叉搜尋樹的比較判別,前面說到按順序插入序列可以確定一棵唯一的二叉搜尋樹,但一棵二叉搜尋樹卻可以有多種插入序列得到。所以我們可以建立一棵樹作為基礎,然後通過其他要做比較的樹的插入序列來判別兩棵樹是否一致。

這句話是什麼意思,假設我們根據插入序列1

構造了一棵二叉搜尋樹,插入序列2為

,按照這兩種插入序列插入空樹形成的二叉搜尋樹,如何判別是否一致?

我們的方法是,把序列1建立成一棵二叉搜尋樹,然後在樹中按順序遍歷搜尋序列

2中的每乙個數,如果每次搜尋時,經過的結點都被搜尋過,那就是一樣的兩棵搜尋樹;否則,如果某次搜尋時,經過有前面沒被搜尋過的結點,那這兩棵樹就不一樣。這個方法的意思是:

例如序列1構造的樹

bt,序列

2中的序列我們按順序乙個乙個的在

bt裡搜尋。一開始搜尋5,

5是根結點,找到了,接下來到

4,查詢

4時會經過左結點

3,這時的

3時前面沒被搜尋過的,所以這樣我們就可以判別這兩個序列形成的二叉搜尋樹時不同的。

根據這個方法,我們在構建二叉搜尋樹的結構時就要加乙個標記,flag=0;用作後面判別時,判斷這個結點有沒有被搜尋過,

flag

一開始定義為

0,表示沒搜尋過,被搜尋過後的結點的

flag

就令它等於1。

然後是判別的**:

函式的兩個引數乙個是樹bt,根據乙個序列建立的二叉搜尋樹。另乙個引數

x為要判別是否一致的另乙個插入序列。然後看程式,第

75行判斷結點的

flag

,如果被搜尋過,也就是

flag==1

,就會做遞迴遍歷搜尋,否則如果遇到

flag==0

,也就是遇到沒被搜尋過的結點,這時就要做判斷了。第

83行開始,判斷這個沒被搜尋過的結點的

data和x

是否相等,如果相等,就是說這個結點就是我要搜尋的結點,就把它的

data設為1

。如果該結點的

data和x

不相等,也就是說在搜尋過程中,沒找到要搜尋的元素時,就碰到了前面沒被搜尋過的結點,那麼就可以判斷這個插入序列和樹

bt是不相等的了。這個判別函式的結構就是乙個查詢的結構。

是否同一棵二叉搜尋樹

5 4 是否同一棵二叉搜尋樹 25分 給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。輸入包含若干組測試資料。每...

是否同一棵二叉搜尋樹

04 樹4 是否同一棵二叉搜尋樹 25 分 給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。輸入格式 輸入包含若...

是否同一棵二叉搜尋樹

給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。輸入格式 輸入包含若干組測試資料。每組資料的第1行給出兩個正整數...