1 问题

重建二叉树:给定二叉树的先序遍历(根左右)和中序(左中右)遍历结果,建立这棵二叉树。输入保证二叉树无重复结点

以先序{1, 2, 4, 7, 3, 5, 6, 8}和中序{4, 7, 2, 1, 5, 3, 8, 6}为例

2 分析

先序遍历的特点,我们知道{1, 2, 4, 7, 3, 5, 6, 8}第一个元素1就是树的根节点,然后中序遍历{4, 7, 2, 1, 5, 3, 8, 6}的根节点在中间,因为我们从先序遍历里面得知1就是根节点,所以在中序遍历{4, 7, 2, 1, 5, 3, 8, 6}中,在中序遍历数组1的左边元素都是根节点左子树{4, 7, 2,},这里是3个元素,所以在先序数组里面根节点1的后面3个元素也是左子树{2,4,7},也是根节点的左子树,在中序遍历1的右边边元素都是{5, 3, 8, 6}都是根节点的右子树,然后我们在先序数组里面根节点1的后面第3个元素的后面到尾巴,也就是{3,5,6,8}也就是根节点的右子树。然后我们再把问题分解成构建左子树{2,4,7}和构建右子树{3,5,6,8},以此递归处理。

我们构建左子树

再构建右子树

3 代码实现

import java.io.*;class Tree
{public int value;public Tree left;public Tree right;public Tree(int value){this.value = value;this.left = null;this.right = null;}/***前序遍历 */public void printTree(Tree node){if (null == node)return;System.out.println("value is " + node.value);printTree(node.left);printTree(node.right);}/**得到树的根节点*/public Tree getTree(int[] preDatas, int[] inDatas){if (null == preDatas || null == inDatas){System.out.println("preDatas is null or inDatas is null");return null;}Tree tree = buildTree(preDatas, 0, preDatas.length - 1, inDatas, 0, inDatas.length - 1);return tree;}/**构建树的左右子结构*/public Tree buildTree(int[] preDatas, int preStart, int preEnd, int[] inDatas, int inStart, int inEnd){if (null == preDatas || null == inDatas){System.out.println("preDatas is null or inDatas is null");return null;}System.out.println("preStart is:" + preStart + " preEnd is" + preEnd + " inStart is " + inStart + " inEnd is" + inEnd);//这里就是进行如果树的左子节点和右子节点是否为空进行设置if (preStart > preEnd || inStart > inEnd){return null;}Tree tree = new Tree(preDatas[preStart]);for (int i = inStart; i <= inEnd; ++i){   System.out.println("preDatas[preStart] is " + preDatas[preStart]);if (preDatas[preStart] == inDatas[i]){tree.left = buildTree(preDatas, preStart + 1, preStart + i - inStart, inDatas, inStart, i - 1);tree.right = buildTree(preDatas, preStart + i - inStart + 1, preEnd, inDatas, i + 1, inEnd);break;}}return tree;}
}class test
{public static void main (String[] args) throws java.lang.Exception{int[] preDatas = {1, 2, 4, 7, 3, 5, 6, 8};int[] inDatas = {4, 7, 2, 1, 5, 3, 8, 6};Tree test =  new Tree(0);Tree tree = test.getTree(preDatas, inDatas);if (tree == null){System.out.println("tree is null");return;}//我们进行前序打印树        test.printTree(tree);}
}

4 运行结果

preStart is:0 preEnd is7 inStart is 0 inEnd is7
preDatas[preStart] is 1
preDatas[preStart] is 1
preDatas[preStart] is 1
preDatas[preStart] is 1
preStart is:1 preEnd is3 inStart is 0 inEnd is2
preDatas[preStart] is 2
preDatas[preStart] is 2
preDatas[preStart] is 2
preStart is:2 preEnd is3 inStart is 0 inEnd is1
preDatas[preStart] is 4
preStart is:3 preEnd is2 inStart is 0 inEnd is-1
preStart is:3 preEnd is3 inStart is 1 inEnd is1
preDatas[preStart] is 7
preStart is:4 preEnd is3 inStart is 1 inEnd is0
preStart is:4 preEnd is3 inStart is 2 inEnd is1
preStart is:4 preEnd is3 inStart is 3 inEnd is2
preStart is:4 preEnd is7 inStart is 4 inEnd is7
preDatas[preStart] is 3
preDatas[preStart] is 3
preStart is:5 preEnd is5 inStart is 4 inEnd is4
preDatas[preStart] is 5
preStart is:6 preEnd is5 inStart is 4 inEnd is3
preStart is:6 preEnd is5 inStart is 5 inEnd is4
preStart is:6 preEnd is7 inStart is 6 inEnd is7
preDatas[preStart] is 6
preDatas[preStart] is 6
preStart is:7 preEnd is7 inStart is 6 inEnd is6
preDatas[preStart] is 8
preStart is:8 preEnd is7 inStart is 6 inEnd is5
preStart is:8 preEnd is7 inStart is 7 inEnd is6
preStart is:8 preEnd is7 inStart is 8 inEnd is7
value is 1
value is 2
value is 4
value is 7
value is 3
value is 5
value is 6
value is 8

5 总结

中途遇到这个一个错误

error: <identifier> expected

是我在手写函数的时候参数前面忘记了定义类型,所以报这个错误。

我们这里用了4个指针,分别是先序的起尾指针和中序的起尾指针,然后我们不断更新4个指针指针的位置,然后当先序的起指针大于尾指针的时候或者中序的起指针大于尾指针的时候我们就构建空指针,就这样递归处理就行。

剑指offer之重建二叉树相关推荐

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

    [LeetCode]剑指 Offer 07. 重建二叉树 文章目录 [LeetCode]剑指 Offer 07. 重建二叉树 package offer;import java.util.ArrayD ...

  2. 剑指Offer #04 重建二叉树(递归)

    题目来源:牛客网-剑指Offer专题 题目地址:重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序 ...

  3. [剑指offer]8.重建二叉树

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

  4. 剑指Offer系列 重建二叉树

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

  5. 剑指offer——7.重建二叉树

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

  6. 剑指 Offer 07. 重建二叉树【千字分析,三种方法】

    立志用最少的代码做最高效的表达 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3,9,2 ...

  7. 【※ LeetCode 剑指 Offer 07. 重建二叉树(中等)】尚待完善

    题目: 输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点. 假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 来源:力扣(LeetCode) 链接:https://leetc ...

  8. 剑指offer 07重建二叉树(根据前序、中序遍历)草真tm难

    /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode ...

  9. 剑指 Offer 07. 重建二叉树

    ⭐简单说两句⭐ CSDN个人主页:后端小知识

最新文章

  1. c语言程序设置分数,用C语言编程平均分数
  2. UA MATH564 概率论 Dirichlet分布
  3. 什么用于创建python与数据库之间的链接_python3连接数据库用什么
  4. Java数据库连接池--DBCP浅析
  5. Java应用程序的令牌认证
  6. html中css二级联动,html二级联动学习笔记
  7. selenium-webdriver——如何在启动firefox时加载扩展
  8. 一个简单的Java Web项目
  9. phpeclipse中操作svn
  10. 毕设-基于SSM仓库管理系统
  11. 从头开始聊P问题、NP问题与NPC问题
  12. quot;紫陀螺quot;网友感触转载系列之…
  13. Runloop与UITableView简单结合
  14. 现代网页的灵魂 —— JavaScript
  15. 查看word的版本型号
  16. word转pdf(docx4j)
  17. Oracle官方文档日记
  18. 90分钟详解网络编程相关的细节处理丨 reactor丨网络io丨epoll丨C/C++丨Linux服务器开发丨后端开发丨Linux后台开发
  19. 医院的PACS影像系统搭建.
  20. 潇洒学校老师小课堂:数控车床上螺纹加工的三大问题和解决方法

热门文章

  1. 磨刀不误砍柴工—Exceptionless搭配log4net记录日志
  2. 如何实现 asp.net core 安全优雅退出 ?
  3. .NET 6新特性试用 | DateOnly和TimeOnly类型
  4. 数字化如何界定IT与OT?
  5. Dapr牵手.NET学习笔记:跨物理机负载均衡服务调用
  6. 面向.NET开发人员的Dapr——发布和订阅
  7. 一句 Task.Result 就死锁, 这代码还怎么写?
  8. WPF使用Animation仿WeChat(微信)播放语音消息
  9. C#使用iTextSharp操作PDF文件
  10. 2020 .NET 开发者峰会顺利在苏州落幕,相关数据很喜人以及线上直播回看汇总