C 根据 前序 中序遍历输出后序遍历
2013-03-19 22:42
141 查看
#include <stdio.h> #include <stdlib.h> void printT(char pred[],int pre_start,int pre_end,char inod[],int in_start,int in_end); int main(){ //char pred[]="ABDECFG"; //char inod[]="DBEACGF"; //printT(pred,0,6,inod,0,6); //char pred[]="ABCDEF"; //char inod[]="CBDAFE"; //这个例子是E没有右孩子 //printT(pred,0,5,inod,0,5); char pred[]="ABCDEF"; char inod[]="BCAEDF";//这个例子是B没有左孩子 printT(pred,0,5,inod,0,5); return 1; } void printT(char pred[],int pre_start,int pre_end,char inod[],int in_start,int in_end){ //根 char root=pred[pre_start]; if(in_start>in_end) return ;//非法节点 这句话必须有//怎么会出现非法子树呢? if(pre_start==pre_end || in_start==in_end ){//表明此时该树只有一个节点 printf("%c,",root); return; } //寻找该根在中序遍历中的位置 这样才能确定该根的左右子树 int leftNo=0;//统计左子树总节点数 int inIndex=in_start;//用于记录root在中序遍历中的位置 while(inod[inIndex]!=root){ inIndex++; } leftNo=inIndex-in_start; //左子树 //上面已经求出了左子树的节点个数 那么pred中左子树的范围就很好确定了 printT(pred,pre_start+1,pre_start+leftNo,inod,in_start,inIndex-1); //右子树 printT(pred,pre_start+leftNo+1,pre_end,inod,inIndex+1,in_end); printf("%c,",root); } /* 关于非法子树 假如某一个子树 没有左边孩子 或者没有右边孩子 假如这一层的没有左孩子 那么在中序遍历中in_start==inIndex 那么本次算出来的in_start 会大于 inIndex-1 进入本层 左子树 后 左子树接收到的in_start就大于 in_end 属于非法子树 假如这一层没有右孩子 那么在中序遍历中 inIndex==in_end 进入本层的 右子树这一层后 接收到的in_start>in_end 属于非法子树 */
相关文章推荐
- 根据前序遍历、中序遍历构建二叉树,并后序遍历输出。
- 根据二叉树的后序遍历以及中序遍历还原二叉树
- 1138. Postorder Traversal (25) (根据先序,中序遍历建立二叉树,输出后序的第一个)
- 根据二叉树的前序遍历和中序遍历(或者中序遍历和后序遍历)还原二叉树
- POJ 2255 Tree Recovery(根据前中序遍历,求后序遍历)
- PAT 1086. Tree Traversals Again (25)(依据中序遍历的非递归形式用到的堆的状态,来构造树并输出后序遍历)
- POJ 2255 Tree Recovery(根据前序遍历和中序遍历,输出后序遍历)
- 根据二叉树的后序遍历以及中序遍历还原二叉树
- 重建二叉树——输入前序、中序遍历构建二叉树并输出后序遍历
- 根据前序遍历,中序遍历求后序遍历
- 【根据二叉树的后序遍历以及中序遍历还原二叉树】
- 根据中序遍历和后续遍历,输出树的层次遍历
- 每日算法三道之根据二叉树的前中序遍历结果求后序遍历
- 根据树的前序遍历和中序遍历构造树,输出后序遍历
- 根据中序遍历和后续遍历,输出树的层次遍历
- 根据前序遍历,中序遍历构建二叉树
- USTC机试—根据输入的十进制数字转化成二进制数字输出的同时,输出2进制数字中1的个数
- 7-1 根据后序和中序遍历输出先序遍历(25 分)
- 二叉树:根据二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 二叉树系列(1)已知二叉树的中序遍历和前序遍历,如何求后序遍历