一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹:對於任一結點,
其左子樹中所有結點的鍵值小於該結點的鍵值;
其右子樹中所有結點的鍵值大於等於該結點的鍵值;
其左右子樹都是二叉搜尋樹。
所謂二叉搜尋樹的「映象」,即將所有結點的左右子樹對換位置後所得到的樹。
給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。
輸入格式:
輸入的第一行給出正整數 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我的做法比較「原始」,先把給出的陣列看作就是「二叉搜尋樹的前序遍歷」或「二叉搜尋樹映象的前序遍歷」(這裡映象的做法就是把左右子樹反著建),然後前序遍歷,若兩棵樹的前序遍歷結果有一顆與所給陣列順序完全一致,則輸出「yes」,並輸出後序遍歷結果,否則輸出「no」。
#pragma gcc optimize(3,"ofast","inline")
#pragma g++ optimize(3)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
typedef pair pll;
typedef pair<
int,
int> pii;
typedef queue<
int> q_i;
typedef queue q_s;
typedef queue<
double
> q_d;
typedef queue q_ll;
typedef queue<
char
> q_c;
typedef priority_queue<
int> pq_i;
typedef priority_queue pq_s;
typedef priority_queue<
double
> pq_d;
typedef priority_queue pq_ll;
typedef stack<
int> s_i;
typedef stack s_s;
typedef stack<
double
> s_d;
typedef stack s_ll;
typedef stack<
char
> s_c;
typedef map m_ll_ll;
typedef map<
int,ll> m_i_ll;
typedef map<
int,
int> m_i_i;
typedef map m_s_ll;
typedef map<
char
,int
> m_c_i;
typedef map<
char
,ll> m_c_ll;
const ll inf=
0x3f3f3f3f
;#define rep(i,l,r) for(ll i=l;i<=r;i++)
#define per(i,l,r) for(ll i=r;i>=l;i--)
#define eif else if
#define n 100005
#define mm(dp) memset(dp,0,sizeof(dp))
#define mm1(dp) memset(dp,-1,sizeof(dp))
#define mm2(dp) memset(dp,0x3f,sizeof(dp))
#define it set::iterator
#define fs(n) fixed<< setprecision(n)
//const double e=2.71828182845;
#define max(a,b) a>b?a:b
#define min(a,b) aconst
double pi =
acos(-
1.0)
;inline ll read()
while
(ch>=
'0'&&ch<=
'9')
s=s*
10+ch-
'0',ch=
getchar()
;return s*w;
}inline
void
write
(ll x)
int a[
1005];
int n;
struct node
;struct node *head,
*p,*t,
*q,*head0;
int u=0;
int v=0;
int v1=0;
int c[
1005];
int d[
1005];
int b[
1005];
void
create1
(int nm,
struct node*
&head1)
else
}void
create2
(int nm,
struct node*
&head1)
else
else
create2
(nm,head1->l);}
}void
qian
(struct node *t1)
void
qian1
(struct node *t1)
void
hou(
struct node *t1)
intmain()
p=(struct node *
)malloc
(sizeof
(struct node));
p->num=a[1]
; head=p;
head->l=
null
; head->r=
null
;rep
(i,2
,n)qian
(head)
; q=
(struct node *
)malloc
(sizeof
(struct node));
q->num=a[1]
; head0=q;
head0->l=
null
; head0->r=
null
;rep
(i,2
,n)qian1
(head0)
;int flag=0;
int flag1=0;
rep(i,
1,n)
}rep
(i,1
,n)}
if(flag==
1&&flag1==1)
else
cout<}else
cout
}
這是二叉搜尋樹嗎?
一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。輸入格式 輸入的第一行給出正整數n 1000 隨後一行給出n個整數鍵值,...
天梯賽 這是二叉搜尋樹嗎?
l2 004 這是二叉搜尋樹嗎?25 分 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。輸入的第一行給出正整數 n 1...
這是二叉搜尋樹嗎?(二叉搜尋樹前序轉後序)
輸入樣例 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 include using na...