根据前序遍历序列和中序遍历序列构造二叉树算法

来源:互联网 发布:矩阵和伴随矩阵的秩 编辑:程序博客网 时间:2024/05/17 23:39
http://blog.csdn.net/yunzhongguwu005/article/details/9270085
 1 确定根,确定左子树,确定右子树
 2 在左子树中递归
 3 在右子树中递归
 4 打印当前根
I 前序遍历的第一个就是根。
II 中序遍历根据根,分成左子树和右子树。
III 重复I步


#include <iostream>#include <string>#include "stdlib.h"using namespace std;typedef struct BiNode{  char data;  struct BiNode *lchild;  struct BiNode *rchild;}BiNode,*BiTree;void CreateBiTree(BiTree&t, string presequence,string insequence){  //it is leaf  if (presequence.length()==0)  {    t=NULL;    return ;  }   //root  char rootNode=presequence[0];  //root location in inorder  int index=insequence.find(rootNode);  //left child sequence  string lchild_insequence=insequence.substr(0,index);  //right chlid sequence  string rchild_insequence=insequence.substr(index+1);  //left child length  int lchild_length=lchild_insequence.length();  //right child length  int rchild_length=rchild_insequence.length();  //left child presequence  string lchild_presequence=presequence.substr(1,lchild_length);  //right child presequence  string rchild_presequence=presequence.substr(1+lchild_length);  t=(BiTree)malloc(sizeof(BiNode));  if (t!=NULL)  {     t->data=rootNode;    CreateBiTree(t->lchild,lchild_presequence,lchild_insequence);    CreateBiTree(t->rchild,rchild_presequence,rchild_insequence);  }}void  PreOrderTraverse(BiTree&t){  if (t!=NULL)  {    cout<<t->data;    PreOrderTraverse(t->lchild);    PreOrderTraverse(t->rchild);  }}void InOrderTraverse(BiTree&t){  if (t!=NULL)  {    InOrderTraverse(t->lchild);    cout<<t->data;    InOrderTraverse(t->rchild);  }}main(){  BiTree t;  string presequence="ABCDEFG";  string insequence="CBEDAFG";;    CreateBiTree(t,presequence,insequence);   PreOrderTraverse(t);  cout<<endl;  InOrderTraverse(t);  getchar();     return 0;}


0 0