一、题目:

  输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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四之重建二叉树的更多相关文章

  1. 剑指Offer(四):重建二叉树

    说明: 1.本系列是根据<剑指Offer>这个系列做的一个小笔记. 2.直接动力是因为师兄师姐找工作很难,而且机械出生的我面试算法更难. 3.刚开始准备刷LeetCode.LintCode ...

  2. 【剑指offer】07重建二叉树,C++实现

    本博文是原创博文,转载请注明出处! # 本文为牛客网<剑指offer>刷题笔记 1.题目 # 输入某二叉树的前序遍历和中序遍历的结果,重建二叉树 2.思路(递归) # 前序遍历中,第一个数 ...

  3. 剑指Offer对答如流系列 - 重建二叉树

    面试题6:重建二叉树 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8} ...

  4. 剑指offer 4.树 重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  5. 【剑指offer】04 重建二叉树

    题目地址:重建二叉树 题目描述                                    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不 ...

  6. 【剑指 Offer】07.重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 示例: 前序遍历 preorder = [3,9,20,15,7] 中序遍历 ...

  7. 【剑指Offer】07. 重建二叉树 解题报告(Java & Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 基本方法:线性查找根节点的位置 方法优 ...

  8. 剑指Offer - 九度1521 - 二叉树的镜像

    剑指Offer - 九度1521 - 二叉树的镜像2013-11-30 23:32 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入 ...

  9. 剑指Offer - 九度1368 - 二叉树中和为某一值的路径

    剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...

随机推荐

  1. js正则 - 正则判断是否为数字与字母的混合

    function istrue(str){  var reg=/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i;  return reg.test(str); ...

  2. LPCSTR与CString转换

    1.LPCSTR是Win32和VC++所使用的一种字符串数据类型,L表示long,P表示指针,C表示常量,STR表示字符串. 2.LPCSTR转化为CString: LPCSTR  lpStr=&qu ...

  3. VMware Authorization Service不能启动 VMware虚拟机状态已挂起无法恢复解决方案

    在网上看说在服务里面启动 但也是不能用 电脑上说是WINDOWS无法启动VMware Authorization Service服务(位于本地计算机上)错误:1068 依赖服务或组无法启动 这个很简单 ...

  4. 常见笔记本进入bios方法

    联想 y510p ->F2 ThinkPad E431 -> Fn + F1

  5. FastDFS分布文件系统Java客户端集成

    参考博客:http://blog.csdn.net/xyang81/article/details/52847311 官网Java客户端源代码: https://github.com/happyfis ...

  6. (转)设置VMWARE通过桥接方式使用主机无线网卡上网

    转自:http://www.cnblogs.com/liongis/p/3265458.html 环境:WIN7旗舰版,台式机,U盘无线上网卡. 虚拟软件:VMware9.0,虚拟系统:CentOS6 ...

  7. 创建私有maven服务器

    私服的创建 1.下载nexus服务  nexus-2.12.0-01-bundle https://pan.baidu.com/s/1o8OfieI 2.下载maven工具   apache-mave ...

  8. mysql 中 datetime和 timestamp的区别

    DATETIME日期和时间的组合.支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'.MySQL以'YYYY-MM-DD HH:MM:SS'格式显示DA ...

  9. 第一次Java实验

      模仿JavaAppArguments.java实例,编写一个程序,此程序从命令行接受多个数字,求和之后输出. 1.设计思路:命令行参数都是字符串,必须将其转化成数字才能相加,定义一个数组接收字符串 ...

  10. 《计算机科学基础》学习笔记_Part 1 Computer and Data

    Technorati Tags: 计算机科学基础,读书笔记 Chapter 1. Introduction Ø  计算机:黑盒,Output Data=f(Input Data, Program) Ø ...