重建二叉树

原创 2018年04月16日 20:43:49

题目
知道二叉树的前序和中序遍历序列,这棵二叉树没有重复的数据

解题思路
1)知道一颗二叉树的前序和中序序列可以唯一确定一棵二叉树
2)递归,对数组分成一段一段的
这里写图片描述
应该注意的点
1)给定的序列不能含有重复的数字
2)给定的序列必须是正确的正确的序列
测试用例
斜二叉树,普通二叉树,空二叉树
解法
遇到了两种解法
1)就是比较常见的,传递数组引用

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
   public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
       if(pre == null || in == null || pre.length == 0 || in.length == 0 || (pre.length != in.length)) {
           return null;
       }
       TreeNode root = createBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1);
       return root;
    }

    public TreeNode createBinaryTree(int [] pre, int preSta, int preEnd, int [] in, int inSta, int inEnd) {
        if(preSta > preEnd || inSta > inEnd) {
            return null;
        }
        TreeNode treeNode = new TreeNode(pre[preSta]);
        int i = 0;
        for(; i < in.length; i++) {
            if(pre[preSta] == in[i]) {
                break;
            }
        }
        treeNode.left = createBinaryTree(pre, preSta + 1, preSta + i - inSta, in, inSta, i - 1);
        treeNode.right = createBinaryTree(pre, preSta + i - inSta+1, preEnd, in, i + 1, inEnd);
        return treeNode;
    }
}

另外一种解法是借助Arrays.copyOfArray(arr orignal, int from, int to);
这个函数的特点
1)是native methods 非java编码写的,是C写的
2)[from, to) ;
3) 不管有没有复制元素,都会得到一个数组的引用

public static void main(String[] args) {        
        int[] a = {1};
        int[] b = Arrays.copyOfRange(a, 1, 1);
        if(b == null) {
            System.out.println("b is null");
        } else {
            // 执行这个分支 输出 0
            System.out.println(b.length);
        }   
    }

下面这个做法是比较消耗内存的,但是在牛客里无法编译

链接:https://www.nowcoder.com/questionTerminal/8a19cbe657394eeaac2f6ea9b0f6fcf6
来源:牛客网

public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
       if(pre.length == 0||in.length == 0){
            return null;
        }
        TreeNode node = new TreeNode(pre[0]);
        for(int i = 0; i < in.length; i++){
            if(pre[0] == in[i]){
                node.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i+1), Arrays.copyOfRange(in, 0, i));
                node.right = reConstructBinaryTree(Arrays.copyOfRange(pre, i+1, pre.length), Arrays.copyOfRange(in, i+1,in.length));
                break;
            }
        }
        return node;
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mozha_666/article/details/79966205

剑指Offer面试题6(Java版):重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重新构造出该二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。例如输入的前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历为{4,7...
  • jsqfengbao
  • jsqfengbao
  • 2015-07-27 18:36:52
  • 5610

数据结构:关于重建二叉树的三种思路

如果,告诉你有一棵二叉树前序遍历的结果为:ABC;中序遍历的结果为:BAC。我们可以很轻松地写出这棵二叉树就是以A为根节点、其左孩子是B、右孩子是C。那么从代码的角度,或者说是从算法的角度又要怎么来编...
  • u013761665
  • u013761665
  • 2015-11-24 00:27:46
  • 6324

【剑指Offer】重建二叉树

题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路输入的是前序遍历及中序遍历的结...
  • zgljl2012
  • zgljl2012
  • 2015-09-16 14:01:40
  • 1732

重建二叉树 C语言实现

主要根据编程之美中利用前序与中序遍历实现二叉树的重构。其中对于前序遍历中的每一个节点都是当前子树的根节点这一理论来对中序遍历进行划分。 并且也实现了根据中序遍历与后序遍历实现二叉树的重构,其中对于后...
  • yyme411
  • yyme411
  • 2013-11-08 20:01:58
  • 1162

Java笔记---剑指Offer(一:Java实现重建二叉树)

一、前言最近正在准备找实习,因此拿起《剑指Offer》来看看,突击下自己的基础。但是《剑指Offer》上面的算法都是使用C语言,个人对C语言不熟悉,因此使用自己熟悉的Java来实现。嗯,以后要是机试啥...
  • GuLu_GuLu_jp
  • GuLu_GuLu_jp
  • 2016-03-09 11:15:41
  • 1087

剑指offer--重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5...
  • kangaroo835127729
  • kangaroo835127729
  • 2015-04-10 22:57:31
  • 2330

重建二叉树 leetcode

http://www.cplusplus.com/reference/algorithm/find/
  • jitashiwoxihuande
  • jitashiwoxihuande
  • 2014-11-17 20:20:15
  • 395

剑指offer----重建二叉树---java实现

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,...
  • snow_7
  • snow_7
  • 2016-07-04 17:29:39
  • 562

剑指Offer——重建二叉树——C++

重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中...
  • hellozmz
  • hellozmz
  • 2016-11-25 10:52:45
  • 1037

POJ 2255 根据二叉树的前序和中序序列来重建二叉树

根据二叉树的前序和中序序列来重建二叉树,输出其后序序列这是面试笔试中经常遇到的问题关键要理解再先序和后序序列中找左右子树的先序和后序序列的方法,利用递归实现#include #include ...
  • yangliuy
  • yangliuy
  • 2010-11-16 18:05:00
  • 2284
收藏助手
不良信息举报
您举报文章:重建二叉树
举报原因:
原因补充:

(最多只允许输入30个字)