根据二叉树先序和中序遍历结果求其后序遍历
来源:互联网 发布:淘宝宝贝如何设置打折 编辑:程序博客网 时间:2024/05/15 04:16
首先我们先复习下不同类别的遍历:
先序遍历:遍历二叉树时先遍历根节点,然后遍历其左子树,最后遍历右子树。
中序遍历:先遍历其左子树,然后遍历根节点,最后遍历右子树。
后续遍历:先遍历左子树,然后遍历右子树,最后遍历根节点。
假如给定二叉树的先序1,2,4,7,3,5,6,8,和中序4,7,2,1,5,3,8,6,求其后序遍历结果
实现思路是首先构建二叉树,然后后续遍历输出。
由上面的各种不同遍历的定义我们知道,先序遍历第一个元素为根节点,因此我们可以在中序序列中找到根节点的位置,而根据中序遍历的定义,我们知道在中序序列中根节点元素左侧的为左子树,右侧的为右子树。因此可以知道,4、7、2为左子树节点,5、3、8、6为右子树节点。同理我们可以知道先序序列中第二个元素为左子树的根,因此同样可对左子树节点进行划分,在先序序列中去除队列前左子树节点后,即从第5个元素开始即为右子树节点,且第五个即为其根节点。这样递归的去进行划分,直到左右子树为空,为其指定左右孩子,然后依次返回。
以下为实现代码
#include<stdio.h>#include<stdlib.h>typedef int Elemtype;typedef struct node{ Elemtype value; struct node *lchild; struct node *rchild;}tree_node,*tree_pnode;tree_pnode create_tree(Elemtype *pre_traverse,Elemtype* mid_traverse,int size){ if(size<=0) return NULL; int i = 0; for(i;i<size;i++) if(*(mid_traverse+i)==*pre_traverse) break; tree_pnode pnode = (tree_pnode)malloc(sizeof(tree_node)); pnode->value = mid_traverse[i]; pnode->lchild = create_tree(pre_traverse+1,mid_traverse,i); pnode->rchild = create_tree(pre_traverse+i+1,mid_traverse+i+1,size-i-1); return pnode;}void back_traverse(tree_pnode tree){ tree_pnode current = tree; if(tree != NULL) { back_traverse(tree->lchild); back_traverse(tree->rchild); printf("%d ",tree->value); }}int main(){ Elemtype pre_traverse[8] = {1,2,4,7,3,5,6,8},mid_traverse[8] = {4,7,2,1,5,3,8,6}; tree_pnode tree = create_tree(pre_traverse,mid_traverse,8); printf("backtraverse\n"); back_traverse(tree);}
运行结果:7 4 2 5 8 6 3 1
0 0
- 根据二叉树先序和中序遍历结果求其后序遍历
- 已知二叉树的先序、中序遍历序列,求其后序遍历结果。(hduoj1710)
- 已知二叉树先序遍历中序遍历求其后序遍历、重建二叉树
- 二叉树问题-根据前序遍历结果和中序遍历结果得出后序遍历结果
- 二叉树遍历---已知前序遍历和中序遍历求其后序
- 根据后序遍历和中序遍历结果还原二叉树
- 二叉树遍历问题:已知中序遍历和后序遍历结果,求前序遍历结果
- 题目1078:二叉树遍历(根据前序和中序遍历结果,获得后序遍历)
- 根据中序遍历结果和前序(后序)遍历结果重构二叉树
- 根据前序遍历和中序遍历的结果确定后序遍历
- 根据二叉树的前序遍历和中序遍历的结果,重建二叉树
- 根据二叉树前序遍历和中序遍历的结果,重建出该二叉树并后序遍历之 java代码
- 根据中序遍历和后序遍历求二叉树的先序遍历
- 根据中序遍历和先序遍历,后序遍历创建二叉树。
- 根据二叉树前序遍历和中序遍历序列求解后序遍历的算法
- 根据后序和中序遍历重建二叉树
- 二叉树 根据前序遍历和中序遍历 或者 后序遍历和中序遍历建树
- 根据前序遍历和中序遍历,后序遍历和中序遍历重构二叉树
- 我为自己加油
- linux使用积累
- Modeless Dialogs with MFC
- qt实现无标题栏透明可移动窗口
- POJ 2823 Sliding Window 单调队列优化DP
- 根据二叉树先序和中序遍历结果求其后序遍历
- 深入详解python传值问题及内存管理机制
- Topcoder SRM 146 Div2 1000(dfs搜索,经典过桥问题,很有意思)
- HTML样式- CSS
- [C/C++程序员面试宝典] 程序员面试宝典(20)-最长公共子串
- C++ 匿名联合(union) 用法
- 黑马程序员-Map的嵌套应用
- [NOIP 2014复习]第六章:数据结构
- leetcode Triangle