剑指offer第二版-7.重建二叉树
描述:输入某二叉树的前序遍历和中序遍历结果,重建该二叉树。假设前序遍历或中序遍历的结果中无重复的数字。
思路:前序遍历的第一个元素为根节点的值,据此将中序遍历数组拆分为左子树+root+右子树,前序遍历数组拆分为root+左子树+右子树。再对左右子树进行同样的操作。
考点:对二叉树不同遍历方法的掌握。

/**
* Copyright(C) 2019 Hangzhou Differsoft Co., Ltd. All rights reserved.
*
*/
package com.java.offer; import com.java.offer.tree.TraversalOfBinaryTree;
import com.java.offer.tree.TreeNode; /**
* @since 2019年2月18日 下午7:07:37
* @author xuchao
*
* 重建二叉树:
* 前序+中序,后续+中序可以完成重建,而前序+后序无法完成
*/
public class P7_ConstructBinaryTree { public static TreeNode<Integer> constructBinaryTree(int[] pre, int preStart, int preEnd, int[] in, int inStart, int inEnd) {
if (preStart > preEnd || inStart > inEnd) {
return null;
}
TreeNode<Integer> root = new TreeNode<Integer>(pre[preStart]);
for (int i = inStart; i <= inEnd; i++) {
if (in[i] == root.val) {
root.left = constructBinaryTree(pre, preStart + 1, preStart + i - inStart, in, inStart, i - 1);
root.right = constructBinaryTree(pre, preStart + i - inStart + 1, preEnd, in, i + 1, inEnd);
}
}
return root;
} public static void main(String[] args) {
// 1
// / \
// 2 3
// / \
// 4 5
// pre->12453 in->42513 post->45231
int[] pre = { 1, 2, 4, 5, 3 };
int[] in = { 4, 2, 5, 1, 3 }; TreeNode<Integer> root = constructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1);
// 对重建后的树,进行前中后序遍历,验证是否正确
System.out.println(TraversalOfBinaryTree.preorderRecursively(root));
System.out.println(TraversalOfBinaryTree.inorderRecursively(root));
System.out.println(TraversalOfBinaryTree.postorderRecursively(root));
System.out.println(TraversalOfBinaryTree.levelorder(root));
}
}
剑指offer第二版-7.重建二叉树的更多相关文章
- 剑指offer第二版-总结:二叉树的遍历
思想:前序(根左右),中序(左根右),后序(左右根) 前序非递归遍历: 首先判断根是否为空,将根节点入栈 1.若栈为空,则退出循环 2.将栈顶元素弹出,访问弹出的节点 3.若弹出的节点的右孩子不为空则 ...
- 《剑指offer(第二版)》面试题55——判断是否为平衡二叉树
一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点 ...
- 剑指Offer - 九度1385 - 重建二叉树
剑指Offer - 九度1385 - 重建二叉树2013-11-23 23:53 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的 ...
- 《剑指offer 第二版》题解
剑指Offer 按题号排序 面试题 3:数组中重复的数字 面试题 4:二维数组中的查找 面试题 5:替换空格 面试题 6:从头到尾打印链表 面试题 7:重建二叉树 面试题 8:二叉树的下一个节点 面试 ...
- 剑指offer面试题6 重建二叉树(c)
- 剑指offer面试题6 重建二叉树(java)
注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 package com.xsf.SordF ...
- 经典面试题目——找到第n个丑数(参考《剑指offer(第二版)》面试题49)
一.题目大意 给你一个数n,要求返回第n个丑数.其中,丑数的定义如下: 丑数是指只包含因子2.3和5的数.(数字1也是丑数,不过是个特例)引用<剑指offer>上的话来说,对于一个数M,如 ...
- 《剑指offer(第二版)》——面试题36:二叉搜索树与双向链表
具体的题目大意和参考思路在此处不详述(见<剑指offer>),实质就是在中序遍历的过程中调整指针的指向,关于中序遍历有递归和非递归两种操作,所以此处也用了两种方法. 方法1(递归法): 代 ...
- 《剑指offer(第二版)》面试题60——n个骰子的点数
一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释 ...
随机推荐
- Spring 核心技术(1)
接上篇:Spring 框架概述 version 5.1.8.RELEASE 这部分参考文档涵盖了 Spring Framework 所有绝对不可或缺的技术. 其中最重要的是 Spring Framew ...
- WPF中的PathAnimation(路径动画)
原文:WPF中的PathAnimation(路径动画) WPF中的PathAnimation(路径动画) ...
- DateTime格式转换结果
Console.WriteLine(string.Format("ToLongDateString:{0}", DateTime.Now.ToLongDateString())); ...
- ARTS 1.7 - 1.11
每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西! Algorithm: 学习算法 题目: https://leetcod ...
- 年度调查 看看 2016 年 Go 语言调查结果
Go 语言官方博客公布了 2016 年 Go 语言使用调查. 在 3,595 名被调查者中,89% 称他们在工作中或工作之外用 Go 编程:63% 称他们的工作是 Web 开发,但只有 9% 的人只从 ...
- 在Delphi中关于UDP协议的实现
原文地址:在Delphi中关于UDP协议的实现作者:菜心 首先我把UDP无连接协议的套接字调用时序图表示出来 在我把在Delphi中使用UDP协议实现数据通讯收发的实现方法总结如下: 例子描述:下 ...
- 深入探索ScrollWindow
最近做WIN32 API开发时发现对ScrollWindow的一些工作原理并不是太清楚,于是做了相关研究,记载下来和大家共同学习. 首先在WM_CREATE中获取系统字符的宽度和高度 case WM_ ...
- windows下进程间通信的(13种方法)
转自:http://blog.csdn.NET/shiqz/article/details/5862936 摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进 ...
- 【vue系列】Virtual DOM 真的比操作原生 DOM 快吗?
一.前言 网上都说操作真实dom怎么怎么慢,这儿有个例子:http://chrisharrington.github.io/demos/performance/,例子循环2000个随机数组,点击按钮重 ...
- 网站压力测试工具 Webbench简单介绍
Webbech能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况.Webbench的标准测试可以向我们展示服务器的两项内容:每秒钟相应请求数和每秒钟传输数据量.Webbench不但 ...