7-1およびその後の出力先行順走査順序に従って(25分)

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);


}


公開された18元の記事 ウォンの賞賛0 ビュー260

おすすめ

転載: blog.csdn.net/qq_42815711/article/details/104329802