7 4 笛卡爾樹 25分

2021-10-10 08:25:59 字數 1527 閱讀 2462

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

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

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

序號輸入

輸出說明

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測試

8 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測試

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不滿足二叉搜尋樹

11 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

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

1 1 -1 -1

yes邊界測試:最小n

思路:判斷每個節點的k1值是否大於其左子樹的最大值,是否小於其右子樹的最小值。若符合條件則為二叉搜尋樹

然後在判斷每個節點的k2值是否小於其子樹的最小值,若每個節點均符合,那麼則為最小堆

既符合二叉搜尋樹又符合最小堆,那麼輸出yes,其他情況輸出no

#include#define inf 0x3f3f3f3f

using namespace std;

struct node

t[1010];

int f1,f2;

int heapmin(int root)

int searchmin(int root)

int searchmax(int root)

int check(int root)

}if(r!=-1)

for(i=0;iif(!check2(i))

}if(f1||f2)

else

}

5 31 笛卡爾樹 25分

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

7 31 笛卡爾樹 25分

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

9 4 笛卡爾樹(25 分)

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