4-06. 搜索樹判斷(25)
對於二叉搜索樹,我們規定任一結點的左子樹僅包含嚴格小於該結點的鍵值,而其右子樹包含大於或等於該結點的鍵值。如果我們交換每個節點的左子樹和右子樹,得到的樹叫做鏡像二叉搜索樹。
現在我們給出一個整數鍵值序列,請編寫程序判斷該序列是否爲某棵二叉搜索樹或某鏡像二叉搜索樹的前序遍歷序列,如果是,則輸出對應二叉樹的後序遍歷序列。
輸入格式說明:
輸入的第一行包含一個正整數N(<=1000),第二行包含N個整數,爲給出的整數鍵值序列,數字間以空格分隔。
輸出格式說明:
輸出的第一行首先給出判斷結果,如果輸入的序列是某棵二叉搜索樹或某鏡像二叉搜索樹的前序遍歷序列,則輸出“YES”,否側輸出“NO”。如果判斷結果是“YES”,下一行輸出對應二叉樹的後序遍歷序列。數字間以空格分隔,但行尾不能有多餘的空格。
樣例輸入與輸出:
序號 | 輸入 | 輸出 |
1 |
7 8 6 5 7 10 8 11 |
YES 5 7 6 8 11 10 8 |
2 |
7 8 10 11 8 6 7 5 |
YES 11 8 10 7 5 6 8 |
3 |
7 8 6 8 5 10 9 11 |
NO |
4 |
16 100 70 60 62 68 65 69 200 150 140 160 155 300 400 500 450 |
YES 65 69 68 62 60 70 140 155 160 150 450 500 400 300 200 100 |
5 |
17 85 92 100 120 110 105 88 90 50 20 30 40 35 36 32 28 15 |
YES 105 110 120 100 90 88 92 36 32 35 40 28 30 15 20 50 85 |
6 |
7 8 6 7 5 10 11 9 |
NO |
7 |
1 -1 |
YES -1 |
正確代碼:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstdlib>
using namespace std;
#define LEN (struct node*)malloc(sizeof(struct node))
struct node
{
int num;
struct node* l;
struct node* r;
};
vector<int> v;
int nu[1005];
node* Insert(int num,node *t)
{
if(!t)
{
t=LEN;
t->num=num;
t->l=t->r=NULL;
}
else
{
if(num<t->num)
t->l=Insert(num,t->l);
else
t->r=Insert(num,t->r);
}
return t;
}
void qian(node *t)
{
if(!t)
return ;
v.push_back(t->num);
qian(t->l);
qian(t->r);
}
void hou(node *t)
{
if(!t)
return ;
hou(t->l);
hou(t->r);
v.push_back(t->num);
}
void jingxiang(node* t)
{
node *p;
if(!t)
return ;
p=t->l;
t->l=t->r;
t->r=p;
jingxiang(t->l);
jingxiang(t->r);
}
int main()
{
int n,i,flag=0,flag1=0;
node *t;
t=NULL;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&nu[i]);
t=Insert(nu[i],t);
}
qian(t);
for(i=0;i<n;i++)
{
if(v[i]!=nu[i])
{
flag=1;
break;
}
}
if(flag)
{
jingxiang(t);
v.clear();
qian(t);
for(i=0;i<n;i++)
{
if(v[i]!=nu[i])
{
flag1=1;
break;
}
}
}
if(flag&&flag1)
printf("NO\n");
else
{
printf("YES\n");
v.clear();
hou(t);
for(i=0;i<n;i++)
{
if(i)
printf(" ");
printf("%d",v[i]);
}
printf("\n");
}
return 0;
}