头歌两种遍历方法建立一棵树(前序和中序)

///

#include 

#include 

#include 

#include "ConstructTree.h"

/


 

/*

InPreToTree(): 由前序遍历序列和中序遍历序列构造二叉树

前序序列为pa[p1:p2]

中序序列为ia[i1:i2]

返回所构造的二叉树的根指针

*/

TNode* InPreToTree(char *pa, char *ia, int p1, int p2, int i1, int i2)

{

    /*请在BEGIN和END之间实现你的代码*/

    /*****BEGIN*****/

   if(p1>p2){

       return NULL;

   }

   TNode* root=new TNode;

   root->data=pa[p1];//将前序数组中第一个元素赋给data,前序数组第一个值都是根节点。

   root->left=NULL;

   root->right=NULL;

   int i=0;

   while(ia[i]!=pa[p1]){

       i++;

   }//查找根节点在中序数组中的位置。

//递归,每次缩小范围,将树一次一次细分。

   int llen=i-i1;//存储左子树长度

    root->left=InPreToTree(pa,ia,p1+1,p1+llen,i1,i-1);//每个根节点左右子树依次递推下去,双亲和子树的递推方法都是一样的。

    int rlen=i2-i;//存储右子树长度,两个分开存储会更好

    root->right=InPreToTree(pa,ia,p2-rlen+1,p2,i+1,i2);

    return root;

    /******END******/

    /*请不要修改[BEGIN,END]区域外的代码*/

void PrintPostTravel(TNode* t)

{

    if(t==NULL) return;

    if(t->left) PrintPostTravel(t->left);

    if(t->right) PrintPostTravel(t->right);

    printf("%c", t->data);

}

void DeleteTree(TNode* t)

{

    if(t==NULL) return;

    if(t->left) DeleteTree(t->left);

    if(t->right) DeleteTree(t->right);

    delete t;

}

 

你可能感兴趣的:(c++,算法,开发语言)