笛卡爾樹 中序遍歷判斷是否為二叉搜尋樹

2021-07-25 08:52:25 字數 2242 閱讀 7733

笛卡爾樹是一種特殊的二叉樹,其結點包含兩個關鍵字k1和k2。首先笛卡爾樹是關於k1的二叉搜尋樹,即結點左子樹的所有k1值都比該結點的k1值小,右子樹的所有k1值都比該結點的k1值大。其次所有結點的k2值滿足優先佇列(不妨設為最小堆)的順序要求,即該結點的k2值比其子樹中的所有k2值小。給定一棵二叉樹,請判定該樹是否笛卡爾樹。

1.實驗要求

(1)輸入說明:

輸入第一行中給出正整數n(n<=1000),為樹中結點總數。隨後n行,每行給出q乙個結點的資訊,包括:結點的k1值、k2值、左孩子結點編號、右孩子結點編號。設結點從0-(n-1)編號。若某結點不存在孩子結點,則該位置給出-1。       

(2)輸出說明:

如果該樹是一棵笛卡爾樹則輸出yes,否則輸出no。

(3)測試用例:

輸入:                               輸出:

序號輸入

輸出說明16

8 27 5 1                     

9 40 -1 -1

10 20 0 3

12 21 -1 4

15 22 -1 -1

5 35 -1 -1

yes一般情況yes測試

28 27 5 1

9 40 -1 -1

10 20 0 3

12 11 -1 4

15 22 -1 -1

50 35 -1 -1

no一般情況no測試

3 8 27 5 1

9 40 -1 -1

10 20 0 3

12 21 -1 4

11 22 -1 -1

5 35 -1 -1

nok2滿足最小堆順序,但k1不滿足二叉搜尋樹

411 5 3 -1

15 3 4 7

5 2 6 0

6 8 -1 -1

9 6 -1 8

10 1 2 1

2 4 -1 -1

20 7 -1 -1

12 9 -1 -1

no k2滿足最小堆順序;k1的每個子樹都滿足二叉搜尋樹條件,但整棵樹不滿足二叉搜尋樹條件------即簡單的後序遍歷不能給出正確結果

5 1 1 -1 -1

yes邊界測試:最小n

4.解決思路:

(1)問題分析

本題主要分兩個子問題:1.根據輸入的資訊建立二叉樹2.根據樹的結構判斷其是否滿足笛卡爾樹的性質。

判斷其是否滿足笛卡爾樹的性質:

需要分別對k1,k2進行判斷。

對k1鍵值進行中序遍歷,邊遍歷邊比較,若遍歷結果為遞增有序,則是乙個二叉搜尋樹,只要有不符,則不是二叉搜尋樹。

對k2鍵值進行後序遍歷,先檢查左、右子樹是否都滿足條件,若是,則將當前結點的k2值與左右子樹的k2最小值比較,確定是否滿足條件;否則返回no。

(2)實現要點

a.用陣列實現二叉樹的儲存:

注意到題目是用0-(n-1)整型編號代表樹的結點的,所以可以把每個結點的資訊儲存在元素結構體的陣列裡,將結構體中的左右孩子域定義為整型。

b.陣列實現二叉樹的根的表示:

由於題目沒有直接說明哪個結點是根,所以需要在建樹過程中確定根結點資訊。可以為每個結點建立乙個標記tag,初始化為1(即每乙個結點都有可能是根結點)。在建立樹的過程中,不斷將是左右孩子結點的tag設定為0(即有父結點的不是根)。建樹完成後,掃瞄一遍所有結點的tag,唯一乙個tag不為0的結點,就是根結點。

#includestruct nodetree[1010];

int creattree(int n)

int flag2=1;

int isminheap(int root)

else if(tree[root].right!=-1&&tree[root].left==-1)

else

}int main()

用flag1和flag2是因為在遞迴的時候要return k1,k2值來與上一層次比較,無法return false/true來判斷是否為二叉搜尋樹/最小堆。在網上搜尋中序遍歷判斷是否為二叉搜尋樹,發現有兩種方法,一種是多開乙個陣列儲存中序遍歷結果,然後再對陣列裡的值進行遍歷比較。第二種方法是遞迴時return false/true,前驅結點的值用static 來儲存。

//判斷是否為bst

bool isbst(node* root)

return true;

}

PTA P9 中序遍歷樹並判斷是否為二叉搜尋樹

對給定的有n個節點 n 0 的二叉樹,給出中序遍歷序列,並判斷是否為二叉搜尋樹。題目保證二叉樹不超過200個節點,節點數值在整型int範圍內且各不相同。輸入格式 第一行是乙個非負整數n,表示有n個節點 第二行是乙個整數k,是樹根的元素值 接下來有n 1行,每行是乙個新節點,格式為r d e 三個整數...

合法二叉搜尋樹 中序遍歷判斷結果是否為遞增陣列

實現乙個函式,檢查一棵二叉樹是否為二叉搜尋樹。示例 1 輸入 2 1 3 輸出 true 示例 2 輸入 5 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 一開始想了好久不知道用啥方法 大二的資料結構白學了 後來看別...

判斷二叉樹是否為二叉搜尋樹

剛開始我想的很簡單,覺得只要遞迴判斷左孩子是否小於根節點 右孩子是否大於根節點就行了 二叉搜尋樹 左孩子 根結點 右孩子 根節點 下面的寫法 錯的!錯的!二叉樹的判斷應該是左子樹的最大值 小於 根節點 右子樹的最小值大於根節點 bool isvalidbst treenode root if roo...