剑指offer四之重建二叉树
一、题目:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
二、解题思路:

如果理解了递归的访问,那么建树的过程就容易多了,前序遍历序列的第一个数(后序遍历的最后一个数)一定是根结点,所以可以根据此结点在中序序列中的位置把中序序列分为左子树和右子数两个部分,同样的道理,在左子树和右子数中同样可以用到这样的规律来确定每个中间结点。

三、代码
1、重建二叉树
public class ReConstructBinaryTree {
public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
TreeNode root = new TreeNode(pre[0]);//前序的第一个数定为根
int len = pre.length;
//当只有一个数的时候
if (len == 1) {
root.left = null;
root.right = null;
return root;
}
//找到中序中的根位置
int rootval = root.val;
int i;
for (i = 0; i < len; i++) {
if (rootval == in[i])
break;
}
//创建左子树
if (i > 0) {
int[] pr = new int[i];
int[] ino = new int[i];
for (int j = 0; j < i; j++) {
pr[j] = pre[j + 1];
}
for (int j = 0; j < i; j++) {
ino[j] = in[j];
}
root.left = reConstructBinaryTree(pr, ino);
} else {
root.left = null;
}
//创建右子树
if (len - i - 1 > 0) {
int[] pr = new int[len - i - 1];
int[] ino = new int[len - i - 1];
for (int j = i + 1; j < len; j++) {
ino[j - i - 1] = in[j];
pr[j - i - 1] = pre[j];
}
root.right = reConstructBinaryTree(pr, ino);
} else {
root.right = null;
}
return root;
}
}
2、二叉树的节点类
/**
* Definition for binary tree
*/
public class TreeNode {
int val;
TreeNode left;
TreeNode right; public TreeNode(){ } public TreeNode(int x) {
val = x;
} public TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
} //以下是getter和setter方法 public int getVal() {
return val;
} public void setVal(int val) {
this.val = val;
} public TreeNode getLeft() {
return left;
} public void setLeft(TreeNode left) {
this.left = left;
} public TreeNode getRight() {
return right;
} public void setRight(TreeNode right) {
this.right = right;
}
}
3、遍历重构的二叉树
public class Traversal {
public void theFirstTraversal(TreeNode root){ //先序遍历
//输出根节点
printRoot(root);
//遍历左孩子
if(root.getLeft()!=null){
theFirstTraversal(root.getLeft());
}
//遍历右孩子
if(root.getRight()!=null){
theFirstTraversal(root.getRight());
}
}
public void theInOrderTraversal(TreeNode root) { //中序遍历
//遍历左孩子
if (root.getLeft() != null) {
theInOrderTraversal(root.getLeft());
}
//输出根节点
printRoot(root);
//遍历右孩子
if (root.getRight() != null) {
theInOrderTraversal(root.getRight());
}
}
public void thePostOrderTraversal(TreeNode root) { //后序遍历
//遍历左孩子
if (root.getLeft() != null) {
thePostOrderTraversal(root.getLeft());
}
//遍历右孩子
if(root.getRight() != null) {
thePostOrderTraversal(root.getRight());
}
//输出根节点
printRoot(root);
}
public void printRoot(TreeNode root){ //输出根加点的值
System.out.print(root.val+",");
}
}
4、主方法
public class TestMain {
public static void main(String[] args) {
int[] pre={1,2,4,7,3,5,6,8}; //前序遍历的结果
int[] in={4,7,2,1,5,3,8,6}; //中序遍历的结果
//重建的二叉树
ReConstructBinaryTree re=new ReConstructBinaryTree();
TreeNode root=re.reConstructBinaryTree(pre,in);
//二叉树的遍历
Traversal traversal=new Traversal();
traversal.theFirstTraversal(root);//前序遍历
System.out.println();
traversal.theInOrderTraversal(root);//中序遍历
System.out.println();
traversal.thePostOrderTraversal(root);//后序遍历
}
}
-----------------------------------------------------------------------------------------------------------------------------------
参考了的文章链接:
http://blog.csdn.net/qq_23217629/article/details/51718996
剑指offer四之重建二叉树的更多相关文章
- 剑指Offer(四):重建二叉树
说明: 1.本系列是根据<剑指Offer>这个系列做的一个小笔记. 2.直接动力是因为师兄师姐找工作很难,而且机械出生的我面试算法更难. 3.刚开始准备刷LeetCode.LintCode ...
- 【剑指offer】07重建二叉树,C++实现
本博文是原创博文,转载请注明出处! # 本文为牛客网<剑指offer>刷题笔记 1.题目 # 输入某二叉树的前序遍历和中序遍历的结果,重建二叉树 2.思路(递归) # 前序遍历中,第一个数 ...
- 剑指Offer对答如流系列 - 重建二叉树
面试题6:重建二叉树 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8} ...
- 剑指offer 4.树 重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 【剑指offer】04 重建二叉树
题目地址:重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不 ...
- 【剑指 Offer】07.重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 示例: 前序遍历 preorder = [3,9,20,15,7] 中序遍历 ...
- 【剑指Offer】07. 重建二叉树 解题报告(Java & Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 基本方法:线性查找根节点的位置 方法优 ...
- 剑指Offer - 九度1521 - 二叉树的镜像
剑指Offer - 九度1521 - 二叉树的镜像2013-11-30 23:32 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入 ...
- 剑指Offer - 九度1368 - 二叉树中和为某一值的路径
剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...
随机推荐
- Win7 VS2015环境编译Libpng
第3次编译Libpng依然想不起任何东西,为了不浪费第4次的时间... http://libpng.com/pub/png/libpng.html http://www.zlib.net/ 解压两个压 ...
- CProgressCtrl进度条控件实现进度滚动效果
关于CProgressCtrl 控件的基本操作网上有很多资料,可我想实现进度条中进度滚动效果,即很多时候程序出现的等待或启动画面,如下图: 实现这个效果的函数为SetMarquee(_In_ BOOL ...
- 修改oracle用户密码为永不过期
错误提示:ORA-28001: the password has expired (DBD ERROR: OCISessionBegin) 解决方法:修改密码为永不过期 (1)查看用户的proifle ...
- oracle 数据库io 异常,错误代码17002 解决办法
数据库使用一个月了,突然挂掉:错误代码17002 io异常:read timeout 解决: 1.登陆sql命令窗口 [oracle@hostname ~]$ sqlplus /nolog SQL*P ...
- base_expr +: width_expr
在Verilog-1995中,可以选择向量的任一位输出,也可以选择向量的连续几位输出,不过此时连续几位的始 末数值的index需要是常量.而在Verilog-2001中,可以用变量作为index,进行 ...
- VMware Workstation “以独占方式锁定此配置文件失败。可能其它正在运行VMware进程在使用此配置文件”
VMware Workstation客户机异常关闭之后,再启动时提示“以独占方式锁定此配置文件失败...”. 解决方法: 进入客户机的安装目录(注意,非VMware的安装目录),删除所有后缀为lck的 ...
- Vue上传文件:ElementUI中的upload实现
一.上传文件实现 两种实现方式: 1.直接action <el-upload .利用before-upload属性 此种方式有个弊端,就是action是必选的参数,那么action如果和pos ...
- MyBatis(一)helloWorld程序
一.准备两个jar包,第一个:下载myBatis-3.3.1.jar,这里是在CSDN网站处下载的,因为官网打不开.第二个:mysql-connector-java-5.0.8-bin.jar,这个j ...
- MFC载入JPG图片
## 1.定义画图函数 HRESULT CIPCamDlg::draw(char *lpImageFile, HWND hWnd, int nScrWidth, int nScrHeight) { H ...
- java通过poi编写excel文件
public String writeExcel(List<MedicalWhiteList> MedicalWhiteList) { if(MedicalWhiteList == nul ...