實現由雙親節點存儲的樹轉化爲二叉樹的遍歷算法實現


都知道,樹的先根遍歷和後根遍歷分別對應了二叉樹的先序遍歷和中序遍歷,而由先序遍歷和中序遍歷可以確定唯一的二叉樹。


#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;
}


發佈了61 篇原創文章 · 獲贊 53 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章