用先序遍历和中序遍历重建二叉树
来源:互联网 发布:关于人生知乎 编辑:程序博客网 时间:2024/05/02 04:27
我们都知道二叉树有四种遍历结果,先序,中序,后序,层序;并且他们的遍历方式以及遍历结果我们也都知道 二叉树的非递归遍历.
所以: 在二叉树的先序遍历结果中,第一个数字总是树的根结点的值。但在中序遍历结果中,根结点位于序列的中间,左子树的结点值位于根结点的左边,右子树位于根结点的右边,因此,我们需要扫描中序遍历序列,才能找到根结点的值。
所以,我们已知的
先序遍历的结果是:{ 1, 2, 4, 3, 5, 6 };中序遍历的结果是:{ 4, 2, 1, 5, 3, 6 };
我们已知的是先序遍历的第一个结点就是跟结点,所以在中序中就能找到跟结点,所以中序中根结点左边的就是左子树,同时可以在先序中找到右子树的根结点,这样递归的查找就能把每个结点的位置给找清楚了;
Node* _ReBulidTree(T* PreStart, T* PreEnd, T* MidStart, T* MidEnd) { Node* pRoot; pRoot = new Node(*PreStart); if (PreStart == PreEnd && MidStart == MidEnd)//如果只有一个pRoot结点就结束; return pRoot; T* pCur = MidStart; while (pCur <= MidEnd && *pCur != *PreStart) //在中序中找到根结点 ++pCur; size_t lenth = pCur - MidStart; //左子树的长度; T* LeftTreeEnd = PreStart + lenth; //左子树的尾结点 if (lenth > 0)//左子树存在的话,创建左子树 pRoot->_pLeft = _ReBulidTree(PreStart + 1, LeftTreeEnd, MidStart, pCur - 1); //左子树递归的创建 T* RightTreeStart = LeftTreeEnd + 1; //计算出右子树的根结点 if (PreEnd - PreStart > lenth) //如果右子树存在,递归的创建右子树 pRoot->_pRight = _ReBulidTree(RightTreeStart, PreEnd, pCur + 1, MidEnd); return pRoot; }
在这篇博客中,我只是把实现这个问题的关键代码上传了上去,完整的代码请看重建二叉树
0 0
- 用先序遍历和中序遍历重建二叉树
- 从先序遍历和中序遍历重建二叉树
- 前序遍历和中序遍历重建二叉树
- 前序遍历和中序遍历重建二叉树
- 据前序遍历和中序遍历重建二叉树
- 1935. 二叉树重建(根据先序遍历和中序遍历重建二叉树并进行广度优先遍历)
- 剑指offer 重建二叉树-前序遍历和中序遍历重建
- 已知二叉树的前序遍历和中序遍历重建二叉树(二叉树)
- 已知二叉树的后序遍历和中序遍历重建二叉树(二叉树)
- 由前序遍历和中序遍历重建二叉树,再实现后续遍历
- 根据后序和中序遍历重建二叉树
- 根据先序和中序遍历重建二叉树
- 前序和中序遍历重建二叉树
- 根据中序和前序遍历重建二叉树
- 根据前序和中序遍历重建二叉树
- 通过中序和后续遍历数组重建二叉树
- 剑指offer--据前序和中序遍历重建二叉树
- 根据二叉树的前序遍历和中序遍历重建二叉树
- 产品经理之挂在嘴边的指标和概念-全栈工程师熊盼
- LeetCode Algorithms 34. Search for a Range
- c语言 volatile 关键字作用
- 图像常见噪声类型
- 欢迎使用CSDN-markdown编辑器
- 用先序遍历和中序遍历重建二叉树
- kafka数据可靠性深度解读
- 20170506@集合初步
- poj 1887 dp最长下降子序列
- oracle--创建和管理表
- 我从燕大到天工大考研调剂经历及认识
- 基础练习 字符串对比
- IntelliJ IDEA 配置tomcat
- Spring中的自定义类型转换器