一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹:對於任一結點,涉及知識點:二叉樹的重新建立所謂二叉搜尋樹的「映象」,即將所有結點的左右子樹對換位置後所得到的樹。
給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。
輸入的第一行給出正整數 n(≤1000)。隨後一行給出 n 個整數鍵值,其間以空格分隔。
如果輸入序列是對一棵二叉搜尋樹或其映象進行前序遍歷的結果,則首先在一行中輸出
yes
,然後在下一行輸出該樹後序遍歷的結果。數字間有 1 個空格,一行的首尾不得有多餘空格。若答案是否,則輸出no
。7
8 6 5 7 10 8 11
yes
5 7 6 8 11 10 8
7
8 10 11 8 6 7 5
yes
11 8 10 7 5 6 8
7
8 6 8 5 10 9 11
no
二叉搜尋樹的映象進行前序遍歷(根左右遍歷)相當於進行(根右左遍歷)
#include#include#include#includeusing namespace std;
struct node
;int a[1010];
int flag;
int check1(int l,int r)//檢查是否符合前序遍歷
}for(int i=p; i<=r; i++)//a[p](包括a[p])後的點,a[r]之前(包括a[r])的點是a[l]節點的右子樹的點
return check1(l+1,p-1)&&check1(p,r);//檢查左右子樹是否符合條件
}int check2(int l,int r)//映象【左子樹的節點都大於等於根節點,右子樹的節點都小於根節點】
}for(int i=p; i<=r; i++)//右子樹
return check2(l+1,p-1)&&check2(p,r);//檢查左右子樹是否滿足條件
}node *insert1(node *root,int x)
if(root->val>x)//傳過來的形參比根節點小所以插入左子樹中
root->lch=insert1(root->lch,x);
else
root->rch=insert1(root->rch,x);
return root;
}node *insert2(node *root,int x)//映象
if(root->val<=x)//建立左子樹
root->lch=insert2(root->lch,x);
else
root->rch=insert2(root->rch,x);
return root;
}void print(node *root)
else
printf(" %d",root->val);
}int main()
else if(check2(0,n-1))//檢查是否符合鏡面
else
printf("yes\n");
flag=0;
print(root);
return 0;
}
L2 004 這是二叉搜尋樹嗎?
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...
L2 004 這是二叉搜尋樹嗎?
一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,其左子樹中所有結點的鍵值小於該結點的鍵值 其右子樹中所有結點的鍵值大於等於該結點的鍵值 其左右子樹都是二叉搜尋樹。所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對...
L2 004 這是二叉搜尋樹嗎?
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...