PTA P9 中序遍歷樹並判斷是否為二叉搜尋樹

2021-09-27 09:43:13 字數 1633 閱讀 2985

對給定的有n個節點(n>=0)的二叉樹,給出中序遍歷序列,並判斷是否為二叉搜尋樹。

題目保證二叉樹不超過200個節點,節點數值在整型int範圍內且各不相同。

輸入格式:

第一行是乙個非負整數n,表示有n個節點

第二行是乙個整數k,是樹根的元素值

接下來有n-1行,每行是乙個新節點,格式為r d e 三個整數,

r表示該節點的父節點元素值(保證父節點存在);d是方向,0表示該節點為父節點的左兒子,1表示右兒子;e是該節點的元素值

輸出格式:

首先輸出二叉樹的中序遍歷序列,每個元素佔一行。對於空樹,不輸出任何內容。

然後如果給定的樹是二叉搜尋樹,輸出yes 否則輸出no

輸入樣例:

輸出樣例:

1020

25yes

//p9 中序遍歷樹並判斷是否為二叉搜尋樹

#include#include#includeusing namespace std;

map> p;

vectorv;

bool flag=true;

void bl(int k)

for(int i=0;i>r>>d>>e;

p[r][d]=e;

} bl(k);

for(int i=0;i=v[i+1])

flag=false;

if(flag)

cout<<"yes\n";

else

cout<<"no\n";

}上面這個只是題目的一種解法而已,顯然和題目給人的印象解法不同。也是順便複習一下,加深下影響,樓主用正規的解法,也就是建樹的方式來解答此題。

```cpp

//p9的常規解法

#include#includeusing namespace std;

vectorv;

int r;

typedef struct tree* bt;

struct tree;

bt wz=new tree();// wz用來記住r的位置

void insert(bt root)

insert(root->right);

} }void bl(bt root)

}int main()

cin>>k;

bt root=new tree();

root->data=k;

root->left=null;

root->right=null;

for(int i=0;i>r>>d>>e;

bt node=new tree();

insert(root);

node=wz;

if(d==0)

else

}bl(root);

bool flag=true;

for(int i=0;i=v[i+1])

flag=false;

} if(flag)

cout<<"yes\n";

else

cout<<"no\n";

}

這就是常規解法了,沒什麼提示的,就是注意空樹也是二叉搜尋樹就好了。

根據樹的先序遍歷判斷中序遍歷

寫在前邊的話 本文如果有幫助到你,麻煩給博主乙個鼓勵的贊唄 一棵樹的前序遍歷序列為abcdefg,它的中序遍歷序列可能是 a.cabdefg b.abcdefg c.dacefbg d.adcfeg 有這樣乙個知識點,樹的前序序列對應入棧順序,中序遍歷對應出棧順序 這個結論的解釋可以點我檢視 那麼這...

笛卡爾樹 中序遍歷判斷是否為二叉搜尋樹

笛卡爾樹是一種特殊的二叉樹,其結點包含兩個關鍵字k1和k2。首先笛卡爾樹是關於k1的二叉搜尋樹,即結點左子樹的所有k1值都比該結點的k1值小,右子樹的所有k1值都比該結點的k1值大。其次所有結點的k2值滿足優先佇列 不妨設為最小堆 的順序要求,即該結點的k2值比其子樹中的所有k2值小。給定一棵二叉樹...

建立二叉樹並中序遍歷

題目描述 編乙個程式,讀入使用者輸入的一串先序遍歷字串,根據此字串建立乙個二叉樹 以指標方式儲存 例如如下的先序遍歷字串 abc de g f 其中 表示的是空格,空格字元代表空樹。建立起此二叉樹以後,再對二叉樹進行中序遍歷,輸出遍歷結果。輸入輸入有多組測試資料。每組資料為一行字串,長度不超過100...