(1 2 5 4 1)二叉排序樹的相關演算法

2021-07-04 16:28:40 字數 2506 閱讀 1411

題目:輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。

例如輸入陣列{5,7,6,9,11,10,8}則返回true,因為這個整數序列是下圖二叉樹的後序遍歷的結果。如果輸入的陣列是{7,4,6,5},由於沒有哪顆二叉搜尋樹的後續遍歷的結果是這個序列,因此返回false。

在後序遍歷得到的序列中,最後乙個數字是樹的根節點的值。陣列中前面的數字可以分為兩部分:第一部分是左子樹結點的值,它們都比根節點的值小;第二部分是右子樹結點的值,他們都比根節點的值大。

以陣列{5,7,6,9,11,10,8}為例,後序遍歷結果的最後乙個數字8就是根節點的值。在這個陣列中,前3個數字5,7和6都比8小,是值為8的結點的左子樹結點;後3個數字9,11和10都比8 大,是值為8的結點的右子樹結點。

我們接下來用同樣的方法確定與陣列每一部分對應的子樹的結構。這其實就是乙個遞迴的過程。對於序列5,7,6,最後乙個數字6是左子樹的根節點的值。數字5比6小,是值為6的結點的左子結點,而7則是它的右子節點。同樣,在序列9,11,10中,最後乙個數字10是右子樹的根節點,數字9比10小,是值為10的結點的左子結點,而11則是它的右子節點。

我們再來分析一下另乙個陣列{7,4,6,5}。後序遍歷的最後乙個樹是根節點,因此根節點的值是5.由於第乙個數字7比5大,因此對應的二叉搜尋樹中,根節點上是沒有左子樹的,數字7,4,和6都是右子樹結點的值。但我們發現在右子樹中有乙個結點的值是4,比根節點的值5小,這違背了二叉搜尋樹的定義。因此不存在一顆二叉搜尋樹,它的後序遍歷的結果是7,4,6,5.

int judegebst(int arr,int begin,int end)

for(int j = i;j < end;++j)

result = judegebst(arr,begin,i-1);

if(!result)

return 0;

result = judegebst(arr,i,end-1);

if(!result)

return 0;

return 1;

}

題目:輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立新的結點,只能調整樹中結點指標的指向。

比如如下圖中的二叉搜尋樹,則輸出轉換之後的排序雙向鍊錶為:

在二叉樹中,每個結點都有兩個指向子節點的指標。在雙向鍊錶中,每個結點也有兩個指標,他們分別指向前乙個結點和後乙個結點。由於這兩種結點的結構相似,同時二叉搜尋樹也是一種排序的資料結構,因此在理論上有可能實現二叉搜尋樹和排序的雙向鍊錶的轉換。在搜尋二叉樹中,左子結點的值總是小於父節點的值,右子節點的值總是大於父節點的值。因此我們在轉換稱排序的雙向鍊錶時,原先指向的左子結點的指標調整為鍊錶中指向前乙個結點的指標,原先指向右子節點的指標調整為倆表為指向後乙個結點的指標。接下來我們考慮如何轉化。

由於要求轉換之後的鍊錶是排好序的,我們可疑中序遍歷樹中的每乙個結點,這是因為中序遍歷演算法的特點是按照從小到達的順序遍歷二叉樹的每乙個結點。當遍歷到根節點的時候,我們把樹堪稱三部分:值為10的結點,根節點為6的左子樹、根節點為14的右子樹。根據排序鍊錶的定義,值為10的結點將和它的左子樹的最大的乙個結點(即值為8的結點)鏈結起來,同時它還將和右子樹最小的結點(即值為12的結點)鏈結起來,如圖:

按照中序遍歷的順序,當我們遍歷轉換到根節點(值為10的結點)時,它的左子樹已經轉換成乙個排序的鍊錶了,並且處在鍊錶中的最後乙個結點是當前值的最大的結點。我們把值為8的結點根節點鏈結起來,此時鍊錶中的最後乙個結點是10了。接著我們去遍歷轉換右子樹,並把根節點和右子樹最小的結點鏈結起來。至於怎麼去轉換它的左子樹和右子樹,由於遍歷和轉換過程是一樣的,我們自然的想到了遞迴。

思路:假設已經處理了一部分**換了左子樹),則得到乙個有序的雙向鍊錶,現在則需要將根結點和鍊錶的尾結點鏈結,然後再轉換右子樹。

這樣分為三步:

1.轉換左子樹;

2.鏈結根節點。設定根節點的左指標、尾結點的右指標。更新尾結點。

3.轉換右子樹。

**:

/*

struct treenode

};*/

class

solution

private

:

void convertnode(treenode *pcurrent, treenode* &plastnodeinlist)

plastnodeinlist=pcurrent;//

更新尾結點

convertnode(pcurrent

->right,plastnodeinlist);//

轉換右子樹

}};

驗證二叉排序樹相關演算法

include include typedef int keytype typedef char infotype 10 typedef struct node 記錄型別 bstnode 在p所指向的二叉排序樹中,插入值為k的節點 int insertbst bstnode p,keytype k ...

驗證演算法 二叉排序樹相關演算法

問題及 檔名稱 main.cpp 完成日期 2015年12月13日 版本號 codeblocks 問題描述 驗證二叉排序樹相關演算法 輸入描述 無 程式輸出 見執行結果 include include typedef int keytype typedef char infotype 10 type...

排序演算法 二叉排序樹

二叉排序樹的基本思想是將序列中的數讀入乙個二叉樹,在讀入時遵循一定的規則 比如,如果二叉樹的乙個節點有左子節點,那麼左子節點一定比父節點的值小 如果乙個節點有右子節點,那麼右子節點一定比父節點的值大。在二叉排序樹製造完成後,通過採用中序遍歷的方法讀取二叉樹節點的值到序列中,就可以得到乙個公升序序列。...