都知道,樹的先根遍歷和後根遍歷分別對應了二叉樹的先序遍歷和中序遍歷,而由先序遍歷和中序遍歷可以確定唯一的二叉樹。
#include<iostream>
#include<bits/stdc++.h>
#include<vector>
using namespace std;
vector<int>pre;//保存先序遍歷結果
vector<int>post;//保存後序遍歷結果
int bitree[100];//保存二叉樹列表形式結果
int n;
int first_son(int t,int * pa){
// 得到樹的第一個孩子
for (int i = 0;i<n;i++){
if(pa[i] == t)return i;
}
return -2;
}
int next_sib(int t,int * pa){
// 得到樹的孩子的下一個兄弟
for(int i = t+1;i<n;i++){
if(pa[i] == pa[t])return i;
}
return -2;
}
void pre_root(int t,int *pa){
// 先根遍歷
pre.push_back(t);
for(int x = first_son(t,pa);x!=-2;x = next_sib(x,pa)){
pre_root(x,pa);
}
}
void post_root(int t,int * pa){
// 後根遍歷
for(int x = first_son(t,pa);x!=-2;x = next_sib(x,pa)){
post_root(x,pa);
}
post.push_back(t);
}
void creatbitree(int fir_post,int en_post,int fir_pre,int ind){
// 根據先根遍歷和後根遍歷對應的先序遍歷和後序遍歷生成二叉樹
if(en_post-fir_post == 1){bitree[ind] = post[fir_post];return;}
for(int i = fir_post;i<en_post;i++){
if(post[i] == pre[fir_pre]){
bitree[ind] = post[i];
if(i>fir_post){
creatbitree(fir_post,i,fir_pre+1,ind*2);}
if(i<en_post-1){
creatbitree(i+1,en_post,fir_pre+i-fir_post+1,ind*2+1);}
return;
}
}
}
void DisplayTW( int r, int level,int *pa)
//按凹入表示法顯示樹,level爲層次數,可設根結點的層次數爲1
{
if (r >= 0 && r < n)
{
cout<<endl;
for(int i = 0; i< level - 1; i++)
cout<<" ";
cout << r;
for (int child = first_son(r,pa); child != -2; child = next_sib(child,pa))
{
DisplayTW(child, level + 1,pa);
}
}
}
void Display(int r,int level)
//按樹狀形式顯示以r爲根的二叉樹,level爲層次數,可設根結點的層次數爲1
{
if(bitree[r]!= -1)
{
Display(r*2+1, level + 1);
cout << endl;
for(int i = 0; i < 2*(level - 1); i++)
cout << " ";
cout << bitree[r];
Display(r*2, level + 1);
}
}
int main(){
n = 7;
int pa[] = {-1,0,0,0,1,1,2};
pre.clear();
post.clear();
pre_root(0,pa);
post_root(0,pa);
// cout<<"打印樹爲"<<endl;
DisplayTW(0,1,pa);
cout<<endl;
// cout<<"樹的先根遍歷(二叉樹的先序遍歷):"<<endl;
for(int i = 0;i<pre.size();i++)i== pre.size()-1?cout<<pre[i]<<endl:cout<<pre[i]<<" ";
// cout<<"樹的後根遍歷(二叉樹的中序遍歷):"<<endl;
for(int i = 0;i<post.size();i++)i== post.size()-1?cout<<post[i]<<endl:cout<<post[i]<<" ";
memset(bitree,-1,sizeof(bitree));
creatbitree(0,7,0,1);
// cout<<"打印二叉樹爲:"<<endl;
Display(1,1);
cout<<endl;
}