L2 004 這是二叉搜尋樹嗎? BST

2021-09-14 05:12:49 字數 1872 閱讀 5380

一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹:對於任一結點,

其左子樹中所有結點的鍵值小於該結點的鍵值;

其右子樹中所有結點的鍵值大於等於該結點的鍵值;

其左右子樹都是二叉搜尋樹。

所謂二叉搜尋樹的「映象」,即將所有結點的左右子樹對換位置後所得到的樹。

給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。

輸入的第一行給出正整數 n(≤1000)。隨後一行給出 n 個整數鍵值,其間以空格分隔。

如果輸入序列是對一棵二叉搜尋樹或其映象進行前序遍歷的結果,則首先在一行中輸出 yes ,然後在下一行輸出該樹後序遍歷的結果。數字間有 1 個空格,一行的首尾不得有多餘空格。若答案是否,則輸出 no。

輸入樣例 1:

78 6 5 7 10 8 11

輸出樣例 1:

yes5 7 6 8 11 10 8

輸入樣例 2:

78 10 11 8 6 7 5

輸出樣例 2:

yes11 8 10 7 5 6 8

輸入樣例 3:

78 6 8 5 10 9 11

輸出樣例 3:

no題意:

題解:先說下…這道題只拿了24分

我的判斷映象的思路是: 利用bst的性質, 根節點左邊一定小的話, 右邊就一定大於等於, 考慮到映象的問題, 反之同理.

從第二個位置遍歷pre, 發現有2次以上改變單調性的數則不合法, 然後構建bst+後序遍歷即可

求dalao給糾個錯

貼一下柳神的**:

經驗小結:

#include

#include

#include

using

namespace std;

#define ms(x, n) memset(x,n,sizeof(x));

typedef

long

long ll;

const

int inf =

1<<30;

const ll maxn =

1010

;int n, pre[maxn]

;struct node};

bool

judge()

return cnt <=2;

}node*

insert

(node *p,

int data)

else

}int indx =1;

bool ismir =

false

;//用來標識是否為鏡面

bool

judgemir

(node* p)

void

postorder

(node *root)

else

if(indx++==1

) cout << root-

>d;

else cout <<

" "<< root-

>d;

}int

main()

else

cout <<

"yes\n"

; node* root =

newnode

(pre[0]

,null

,null);

for(

int i =

1; i < n; i++

)insert

(root, pre[i]);

ismir =

judgemir

(root)

;postorder

(root)

;return0;

}

L2 004 這是二叉搜尋樹嗎?

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...

L2 004 這是二叉搜尋樹嗎?

一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,其左子樹中所有結點的鍵值小於該結點的鍵值 其右子樹中所有結點的鍵值大於等於該結點的鍵值 其左右子樹都是二叉搜尋樹。所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對...

L2 004 這是二叉搜尋樹嗎?

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...