笛卡爾樹是一種特殊的二叉樹,其結點包含兩個關鍵字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...