已知前序和中序递归后序
来源:互联网 发布:淘宝货源 知乎 编辑:程序博客网 时间: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;
}
//以前序遍历和中序遍历递推后续遍历为例..
//前序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;
}
- 已知前序和中序递归后序
- 已知后序中序递归前序
- 已知中序和后序||前序, 求前,后,层序遍历问题
- 已知前序和中序、后序和中序建立二叉树
- 已知前序和中序遍历恢复二叉树(递归)
- 已知二叉树的中序序列和前序序列(或后序)求解树
- 已知二叉树的中序和前序序列(或后序)求解树
- 已知二叉树的中序和前序序列(或后序)求解树
- 二叉树遍历---已知前序遍历和中序遍历求其后序
- 已知二叉树的中序和前序序列(或后序)求解树
- 已知二叉树的中序序列和前序序列(或后序)求解树
- 已知二叉树的中序和前序序列(或后序)求解树
- 已知后序遍历和中序遍历求解前序遍历
- 已知二叉树的中序和前序序列(或后序)求解树
- 已知中序和前序(或后序)遍历结果生成树
- 已知二叉树的中序和前序序列(或后序)求解树
- 已知 中序 和 前序 后序 任一 求另外一种 C实现~
- 已知二叉树的中序和前序序列(或后序)求解树
- 寻找发帖“水王”--《编程之美》笔记
- 数据存储的字节顺序
- android布局基础及范例(一):QQ登陆界面设计
- 中文乱码(编码解码)问题的解决办法【转】
- 强烈推荐:240多个jQuery插件
- 已知前序和中序递归后序
- 开发者应深入学习的10个Android开源应用项目
- 【Test Design Studio 3】-05.外部工具
- 已知后序中序递归前序
- 在学习递归后序时学到的东西.
- Unix哲学基础
- SAP BW Study note
- 本周不可错过的9款iPhone和iPad应用
- 交换两个数的值