根据中序遍历结果和前序(后序)遍历结果重构二叉树
2017-12-28 22:11
232 查看
问题描述:
给出一棵二叉树的先序(或后序)遍历结果,以及中序遍历结果,如何构造这棵树首先,我们需要回顾二叉树的三种遍历方式:
前序遍历:根+左子树+右子树
中序遍历:左子树+根+右子树
后序遍历:左子树+右子树+根
假设,当前二叉树的前序遍历结果为{1,2,4,5,3,6},中序遍历结果为{4,2,5,1,3,6}
前序遍历的第一个元素,必然是树根,此处为1。
2. 根据“1”在中序出现的位置,将中序遍历的结果分成左右两棵子树,它们的中序遍历分别是:{4,2,5} 和{3,6};这两棵子树的前序结果:{2,4,5}和{3,6}。
3. 现在我们重复步骤1、2,构造左子树
4. 现在我们重复步骤1、2,构造右子树
5. 合并树节点得到最终结果:
结合以上步骤,我们可以总结出如下规律:
1.根据前序(后序也适用)遍历结果,找到树根,设为ROOT,并生成一个以ROOT为根节点,左右子树
都为NULL的树
2.根据ROOT在中序遍历中的索引,将中序遍历结果分为:左子树,右子树;同时我们也要明确左右子树
对应的前序(后序)遍历结果
3.递归的执行步骤1和2即可构造出唯一的二叉树。
代码如下:
// 由前序序列和中序序列构造二叉树 #include <stdio.h> #include <stdlib.h> typedef struct BiNode* BiTree; BiTree createBiTree(BiTree tree, char pre[], char in[]); /************************************* *二叉链表表示二叉树 *data : 节点数据 *lchild : 左孩子 *rchild : 右孩子 **************************************/ typedef struct BiNode { char data; struct BiNode * lchild; struct BiNode * rchild; }; /************************************** *由前序序列和中序序列建立二叉树的过程 *t为要建立的二叉树 *pre为前序序列 *in为中序序列 ***************************************/ BiTree createBiTree(BiTree tree, char pre[], char in[]) { if (pre == NULL || in == NULL) { return NULL; } int index, l_in = 0, r_in = 0, l_pre = 0, r_pre = 0; //根 char rootNode = pre[0]; //根在中序序列中的位置 for (int i = 0; i < sizeof(in); i++) { if (rootNode == in[i]) { index = i; } } char lchild_in[sizeof(in)]; char rchild_in[sizeof(in)]; //左孩子的中序序列 for (int i = 0; i < index; i++) { lchild_in[l_in] = in[i]; l_in++; } //右孩子的中序序列 for (int i = index + 1; i < sizeof(in); i++) { rchild_in[r_in] = in[i]; r_in++; } char lchild_pre[sizeof(pre)]; char rchild_pre[sizeof(pre)]; //左孩子的前序序列 for (int i = 1; i < l_in + 1; i++) { lchild_pre[l_pre] = pre[i]; l_pre++; } //右孩子的前序序列 for (int i = l_in + 1; i < sizeof(pre); i++) { rchild_pre[r_pre] = pre[i]; r_pre++; } tree = (BiTree)malloc(sizeof(BiNode)); if (tree != NULL) { tree->data = rootNode; //递归创建左孩子 createBiTree(tree->lchild, lchild_pre, lchild_in); //递归创建右孩子 createBiTree(tree->rchild, rchild_pre, rchild_in); } }
参考:
根据中序遍历结果和前序(后序)遍历结果重构二叉树根据前序遍历序列和中序遍历序列构造二叉树算法
相关文章推荐
- 根据中序遍历结果和前序(后序)遍历结果重构二叉树
- 算法面试:根据前序遍历结果序列和中序遍历结果序列重构二叉树
- 每天一道LeetCode-----根据中序遍历和后序遍历重构二叉树
- Leetcode - Tree - 106. Construct Binary Tree from Inorder and Postorder Traversal(根据中序遍历和后序遍历重构二叉树)
- [c++]已知二叉树的前序遍历与中序遍历结果(二叉树中不含重复数字),重构二叉树
- 根据两种不同遍历结果重构二叉树
- 根据层次遍历和中序遍历的结果还原一颗二叉树
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 【数据结构与算法】根据遍历结果构建二叉树
- 根据前序遍历和中序遍历结果重建二叉树(递归方法)
- 根据后序-中序遍历结果 来还原一颗二叉树
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 二叉树根据前序遍历和中序遍历重构确定唯一二叉树
- 根据二叉树的前序遍历和中序遍历结果重建二叉树
- 根据二叉树的前序遍历和中序遍历,重构二叉树
- 根据二叉树的中序遍历和后序遍历创建 一棵二叉树,并且返回所创建的树的树高,具体方法请参见下面源码(经过调试,无任何bug存在)
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 中序遍历二叉树将遍历结果存入双向循环链表C语言实现
- 根据二叉树的先序、中序遍历结果重建二叉树
- 根据二叉树的前序遍历和中序遍历,重构出二叉树