這是二叉搜尋樹嗎?

2021-10-10 11:01:51 字數 4221 閱讀 8215

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

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

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

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

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

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

輸入格式:

輸入的第一行給出正整數 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...