二叉树的遍历方式一般包括前序遍历、中序遍历以及后序遍历

  • 前序遍历:根结点 | 左子树 | 右子树

  • 中序遍历:左子树 | 根结点 | 右子树

  • 后序遍历:左子树 | 右子树 | 根结点

二叉树遍历的性质:

  • 已知二叉树的前序遍历和中序遍历可以唯一重建二叉树

  • 已知二叉树的中序遍历和后序遍历可以唯一重建二叉树

  • 已知二叉树的前序遍历和后续遍历不能唯一重构二叉树

采用递归方式来实现二叉树的重建:

  • 递归停止条件:遍历结果的数组长度为0;
  • 递归流程:通过找到根结点,从而将原始遍历结果数组切分为左子树和右子树的遍历结果数组,进行递归。
    • 前序遍历结果数组的第一个元素为根结点;
    • 后续遍历结果数组的最后一个元素为根结点;

二叉树的结点类:

public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}

1. 已知前序遍历和中序遍历重建二叉树——LeetCode105

class Solution {
public TreeNode buildTree(int[] pre, int[] in) {
// 递归停止条件
if (pre.length == 0 && in.length == 0) return null;
// 首先构建根节点
TreeNode root = new TreeNode(pre[0]);
for (int i = 0; i < in.length; i++) {
// 找到中序遍历中的根节点位置
if (in[i] == pre[0]) {
// 根据根节点的位置找到左子树的前序遍历和中序遍历
// 递归构建根节点的左子节点
root.left = buildTree(Arrays.copyOfRange(pre, 1, i + 1), Arrays.copyOfRange(in, 0, i));
// 根据根节点的位置找到右子树的前序遍历和中序遍历
// 递归构建根节点的右子节点
root.right = buildTree(Arrays.copyOfRange(pre, i + 1, pre.length), Arrays.copyOfRange(in, i + 1, in.length));
break;
}
}
return root;
}
}

Arrays.copyOfRange(int[] arr, int start, int end)用于复制数组。其中arr为原始数组,start是复制起始位置,end是复制结束位置,注意区间是左开右闭,即[start,end)

2. 已知中序遍历和后序遍历重建二叉树——LeetCode106

class Solution {
public TreeNode buildTree(int[] in, int[] post) {
if (in.length == 0 && post.length == 0) return null;
TreeNode root = new TreeNode(post[post.length - 1]);
for (int i = 0; i < in.length; i++) {
if (in[i] == post[post.length - 1]) {
root.left = buildTree(Arrays.copyOfRange(in, 0, i), Arrays.copyOfRange(post, 0, i));
root.right = buildTree(Arrays.copyOfRange(in, i + 1, in.length), Arrays.copyOfRange(post, i, post.length - 1));
break;
}
}
return root;
}
}

Java算法之根据二叉树不同遍历结果重建二叉树的更多相关文章

  1. [PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现

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

  2. 027依据前序遍历和中序遍历,重建二叉树(keep it up)

    剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1385 题目描写叙述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.如果输入的前序遍历和中 ...

  3. 剑指offer--(根据前序遍历和中序遍历)重建二叉树

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

  4. 剑指offer面试题6 重建二叉树(java)

    注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 package com.xsf.SordF ...

  5. 【Java】 剑指offer(6) 重建二叉树

    本文参考自<剑指offer>一书,代码采用Java语言.  更多:<剑指Offer>Java实现合集 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的 ...

  6. [算法总结] 20 道题搞定 BAT 面试——二叉树

    本文首发于我的个人博客:尾尾部落 0. 几个概念 完全二叉树:若二叉树的高度是h,除第h层之外,其他(1~h-1)层的节点数都达到了最大个数,并且第h层的节点都连续的集中在最左边.想到点什么没?实际上 ...

  7. 剑指Offer-4.重建二叉树(C++/Java)

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

  8. [leetcode]_根据二叉树的先序遍历(后序遍历) + 中序遍历 重建二叉树

    题目1:Construct Binary Tree from Preorder and Inorder Traversal 给定一棵二叉树的先序遍历和中序遍历,求重建二叉树. 思路: 1.先序遍历的第 ...

  9. 【PHP数据结构】二叉树的遍历及逻辑操作

    上篇文章我们讲了许多理论方面的知识,虽说很枯燥,但那些都是我们今天学习的前提,一会看代码的时候你就会发现这些理论知识是多么地重要了.首先,我们还是要说明一下,我们学习的主要内容是二叉树,因为二叉树是最 ...

随机推荐

  1. PHPExcel将Excel数据导入数据库

    <?php //PHPExcel读取导入Excel数据到数据库(2003,2007通用)使用方法: //先用excel2array()方法将excel表中的数据存储到数组,在从遍历二维数组将数据 ...

  2. 导弹拦截问题 dp c++

    // // Created by snnnow on 2020/4/13. // //每一次拦截只能是降续的导弹 //如果该次不能拦截成功,则拦截次数需要加一 //求每次最大拦截量,以及需要的拦截次数 ...

  3. 2020HDU多校第三场 1005 Little W and Contest

    Little W and Contest Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/O ...

  4. PHP入门之函数

    前言 之前对PHP的类型.运算符和流程控制简单说了一下.想了解的,这是地址. PHP入门之类型与运算符 PHP入门之流程控制 下面对函数简单说一下. 函数的基本概念 为完成某一个功能的程序指令的合集, ...

  5. 渲染导航菜单的同时给每个菜单绑定不同的router跳转

    这个问题一开始的时候,我总想着router跳转只有两种方式 一种@click,一种router-link 然后我想着@click,绑定一个事件,事件下面无法确定我当前是哪个菜单,解决不了. 然后< ...

  6. Python 数字类型转换

    Python数字类型转换: int(x):将 x 转换为一个整数 float(x):将 x 转换为一个浮点数 complex(x,y):将 x 和 y 转换为一个复数.x 为复数的实部,y 为复数的虚 ...

  7. PHP attributes() 函数

    实例 返回 XML 的 body 元素的属性和值: <?php$note=<<<XML<note><to>Tove</to>高佣联盟 www ...

  8. [USACO09NOV]硬币的游戏 博弈 dp

    LINK : coin game 这道题 超级经典去年这个时候我就看过题目了 但时至今日还不会/cy 觉得在做比赛的题目的时候少写省选的题目 多做水题多做不难也不简单的题目就好了. 由于我是真的不会博 ...

  9. “商家参数格式有误”应用切微信H5支付完美解决方案

    一.业务场景发生 最近在跟一些合作公司作业务对接,在对方的APP中接入我们的H5支付,包括微信和支付宝. 那就开搞,进展顺利,貌似一切都在掌握之中,给到对方一个链接即可调起支付.形如: https:/ ...

  10. js跳转界面

    js页面跳转大全 所谓的js页面跳转就是利用javesrcipt对打开的页面ULR进行跳转,如我们打开的是A页面,通过javsrcipt脚本就会跳转到B页面.目前很多垃圾站经常用js跳转将正常页面跳转 ...