7-1およびその後の出力先行順走査順序に従って(25分)
-
タイトル
シーケンスと所定の二進木、木の最初のトラバーサルの出力結果に基づいて、表題請求後順トラバーサル結果。
入力フォーマット:
最初の行は、正の整数N(≤30)を与えるが、ツリー内のノードの数です。続いて二列、各行はNの整数を与え、シーケンス先行順走査の結果は、数字の間のスペースで区切られた、対応しています。対応するバイナリツリーことを確認するために、正しいタイトルを入力します。
出力形式:
ラインで出力付きプレオーダー:ツリー結果の先行順走査。数字の間にスペースがあり、行の最後には、余分なスペースを持っていないかもしれません。
サンプル入力:
7
2 7 6 5 4 3 1
。1 5 4 3 2 6 7
出力サンプル:
プレオーダー2. 6. 5. 4. 3. 1. 7 -
自身がより良い自分自身ので、より明確に、紙に書いたり、描画する対象全体の分析。
-
主なアイデアは、あなたがすべてのノードを取得することができ、再帰的なルートノードを見つけるために、アレイから順に、左部分木が残っている配列順のルートノード、右の右部分木である、再帰的な左右の部分です。
-
コード
#include<bits/stdc++.h>
using namespace std;
int mid[33],post[33];
typedef int Status;
/*先根据后序和中序得出那个二叉树,然后再输出
使用递归来对树进行赋值。后序序列中最后一个元素为根,
中序序列中该结点前的元素为左子树,后的元素为右子树。
对于左/右子树,最后一个在后序序列中出现的元素为子树的根结点,
再看中序序列,依此类推
主要的是怎么后序序列中找子树的根节点,递归中也要求子树的长度来求最后位置的那个根结点
*/
//树的储存结构定义
typedef struct BiTNode{
int data;//结点的值
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree Creat(int *mid,int *post,int n){//根据后序和中序求出树
if(n<1)return NULL;//如果输入出错
int *p = mid;//寻找中序中的根结点
while(p){
if(*p== *(post+n-1))
break;
p++;
}//p为中序中第一个根结点
BiTree T =(BiTree)malloc(sizeof(BiTNode));//开辟空间
T->data=*p;//p为第一个根结点
int len = p-mid;
//递归
T->lchild= Creat(mid,post,len);
T->rchild = Creat(p+1,post+len,n-len-1);
return T;
}
void Print(BiTree T){
if(T){
cout<<" "<<T->data;
Print(T->lchild);
Print(T->rchild);
}
return;
}
int main(){
int n;
BiTree T;
cin>>n;
//输入两个储存后序和中序的数组
for(int i=0;i<n;i++){
cin>>post[i];
}
for(int j=0 ;j < n;j++){
cin>>mid[j];
}
T = Creat(mid,post,n);
//将树前序输出
cout<<"Preorder:";
Print(T);
}