已知前序和中序递归后序

来源:互联网 发布:淘宝货源 知乎 编辑:程序博客网 时间:2024/05/16 05:20
//实现原理:首先..三者知二科解第三个,同时,必须有一个是中序遍历.
//以前序遍历和中序遍历递推后续遍历为例..
//前序ABDEMNPQCFHIGJK
//中序DBMEPNQAHFICJGK
//那么从前序开始..根据前序先访问根节点的性质,那么第一个A就是整棵树的根节点.
//在中序中找到A,那么A的左边就是根节点的左子树,右边就是根节点的右子树..
//所以可以每次递归的由前序的节点顺序把中序遍历分成很多左右子树(把每次的左子树和右子树看成一个完整树)
//同时还有一点要注意..就是每次在中序中分层了以后.在前序中腰把A剔除,并且还要保证下一次构造的
//左子树的前序遍历和中序遍历的节点数是一样的.
//比如在把A访问了以后..在中序的A成分成左右子树.
//那么前序也跟着分,变成BDEMNOQ
//                 中序DBMEPNQ容易发现.这样子保证数目一样的情况下.节点集合是一样的..
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string.h>
#include<vector>
typedef struct   node
{
char   data;
struct   node   *lchild,*rchild;
}BinNode;
typedef   BinNode   *BinTree;
BinNode   *CreateNode(char   c)
{
      BinNode   *n1=new   BinNode;
      n1-> data=c;
      n1-> lchild=NULL;
      n1-> rchild=NULL;
      return   n1;
}
int   searchchar(char   c,char   *order)
{
      for(int   i=0;i <strlen(order);i++)
      {
          if(c==order[i])
  return   i;


      }
      printf("%c\n",c);
      return   -1;
}


BinNode*   CreateTree(char   *pre,char   *in)
{
char   c=pre[0];
char   temppre[100];
char   tempin[100];
char   *p;
int   i=0;
BinNode*   bnode;
if(pre== "NULL")
return   NULL;


memset(temppre,0,100);
memset(tempin,0,100);


bnode=CreateNode(c);
i=searchchar(pre[0],in);
if(i==-1)
return   0;
p=in;
strncpy(tempin,p,i);
p=pre;
strncpy(temppre,p+1,i);
        bnode-> lchild=CreateTree(temppre,tempin);//left


//memset(tempin,0,100);
//memset(temppre,0,100);


p=in+i+1;
strncpy(tempin,p,strlen(in)-i);
p=pre+i+1;
strncpy(temppre,p,strlen(in)-i);
bnode-> rchild=CreateTree(temppre,tempin);   //right
return   bnode;
}


void   POSTORDER(BinNode   *t)
      {
          if(t)                               /*二叉树t非空*/
          {
              POSTORDER(t-> lchild);               /*后序遍历*t的左子树*/
              POSTORDER(t-> rchild);               /*后序遍历*t的右子树*/
              printf( "\t%c ",t-> data);         /*访问结点*/
          }
        }


int   main(int   argc,   char*   argv[])
{




BinNode*   Head;
   char preorder[100] = "ABDEMNPQCFHIGJK";
    char inorder[100] =  "DBMEPNQAHFICJGK";
Head=CreateTree(preorder,inorder);
printf( "后序序列为: ");
POSTORDER(Head);
printf( "\n ");
// printf( "%ld ",strlen(readin));
return   0;
}
原创粉丝点击