對給定的有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...