1. 程式人生 > >根據後序和中序遍歷輸出先序遍歷 (25 分)第六章樹和二叉樹作業1—二叉樹--計算機17級 7-1

根據後序和中序遍歷輸出先序遍歷 (25 分)第六章樹和二叉樹作業1—二叉樹--計算機17級 7-1

7-1 根據後序和中序遍歷輸出先序遍歷 (25 分)

本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。

輸入格式:

第一行給出正整數N(≤30),是樹中結點的個數。隨後兩行,每行給出N個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。

輸出格式:

在一行中輸出Preorder:以及該樹的先序遍歷結果。數字間有1個空格,行末不得有多餘空格。

輸入樣例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

輸出樣例:

Preorder: 4 1 3 2 6 5 7

 思路:現將其還原為二叉樹,最後再先序遍歷輸出即可

後序和中序遍歷確定一顆二叉樹的思路:

a:根據後序遍歷序列確定最後一個結點為根節點

b:根據根結點在中序遍歷序列中分割出左右兩個子序列

c:對左子樹和右子樹分別遞迴使用相同的方法繼續分解

程式碼實現:

#include <bits/stdc++.h>
typedef int TElemType;//千萬別寫成char

#define maxn 101

using namespace std;
typedef struct TNode* BinTree;
struct TNode{
    TElemType data;
    BinTree left;
    BinTree right;
};
int n;
int mid[maxn];
int post[maxn];

BinTree build(int *mid,int *post,int n)//第一個引數是中序序列的起始位置,第二個引數是後序序列的起始位置
{
	BinTree tmp = (BinTree)malloc(sizeof(TNode));
	tmp->data = post[n-1];//第一個結點指向後序遍歷的最後,也就是後序的樹根
	int i;
	if(n == 0)
	    return NULL;
	for(i = 0;i < n;i++)
	{
		if(mid[i] == post[n-1])//找中序的根
	        break;//找到就跳出來
	}
	tmp->left = build(mid,post,i);//傳入左子樹的mid與post
	tmp->right = build(mid+i+1,post+i,n-i-1);//傳入右子樹的mid與post
	//tmp->data = post[n-1];//第一個結點指向後序遍歷的最後,也就是後序的樹根
	return tmp;
}

void PreorderTraversal( BinTree BT )
{
	if(BT)
	{
		cout<<" "<<BT->data;
		if(BT->left)
		    PreorderTraversal( BT->left );
		if(BT->right)
		    PreorderTraversal( BT->right );
    }
    else
        return ;
}



int main()
{
	cin>>n;
	for(int i = 0;i < n;i++)
	    cin>>post[i];
	for(int i = 0;i < n;i++)
	    cin>>mid[i];
	BinTree t = build(mid,post,n);
	cout<<"Preorder:";
    PreorderTraversal(t);
}