
剑指 offer之重建二叉树_java语言
发布日期:2021-05-07 02:40:17
浏览次数:23
分类:精选文章
本文共 1783 字,大约阅读时间需要 5 分钟。
此分类专栏只写关于剑指 offer的66道题!!!
题目:重建二叉树
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 解题思想分析: 递归思想,每次将左右两颗子树当成新的子树进行处理,中序的左右子树索引很好找,前序的开始结束索引通过计算中序中左右子树的大小来计算,然后递归求解,直到startPre>endPre||startIn>endIn说明子树整理完到。方法每次返回左子树和右子树的根节点。 即分析: 在二叉树的前序遍历序列中,第一个数字总是树的根节点的值。但在中序遍历序列中根节点的值在序列的中间,左子树的节点的值位于根节点的值的左边,而右子树的节点的值位于根节点的值的右边,因此我们需要扫描中序遍历序列,才能找到根节点的值。 从上面可知,题目中前序遍历的第一个节点{1}一定是这棵二叉树的根节点,根据中序遍历序列,可以发现中序遍历序列中节点{1}之前的{4,7,2}是这棵二叉树的左子树,{5,3,8,6}是这棵二叉树的右子树。然后,对于左子树,递归地把前序子序列{2,4,7}和中序子序列{4,7,2}看成新的前序遍历和中序遍历序列。此时,对于这两个序列,该子树的根节点是{2},该子树的左子树为{4,7}、右子树为空,如此递归下去(即把当前子树当做树,又根据上述步骤分析)。{5,3,8,6}这棵右子树的分析也是这样。/** * 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) { int startPre = 0; int endPre = pre.length - 1; int startIn = 0; int endIn = in.length - 1; return rebuildTree(pre, startPre, endPre, in, startIn, endIn); } private TreeNode rebuildTree(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) { /* startPre>endPre||startIn>endIn说明子树整理完到 */ if (startPre > endPre || startIn > endIn) { return null; } //找到根节点:前序第一个为根节点 TreeNode root = new TreeNode(pre[startPre]); int index = startIn; for (; index <= endIn; index++) { //当中序中的遍历到与父节点相同的节点时,退出 //此时index的左面是左节点 //index的右面是右节点 if (in[index] == pre[startPre]) { break; } } //递归,再对其进行上述所有步骤,即再区分子树的左、右子子数,直到叶节点 root.left = rebuildTree(pre, startPre + 1, startPre + (index - startIn), in, startIn, index - 1); root.right = rebuildTree(pre, startPre + (index - startIn) + 1, endPre, in, index + 1, endIn); return root; }}
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月12日 08时19分23秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
web项目配置
2021-05-08
基于单片机简易信号误差分析设计-全套资料
2021-05-08
基于单片机简易脉搏测量仪系统设计-毕设课设资料
2021-05-08
Javascript中String支持使用正则表达式的四种方法
2021-05-08
eclipse引用sun.misc开头的类
2021-05-08
Servlet2.5的增删改查功能分析与实现------删除功能(四)
2021-05-08
spring启动错误:Could not resolve placeholder
2021-05-08
查询某表格上次进行vacuum的时间
2021-05-08
invalid byte sequence for encoding
2021-05-08
redis向数组中添加值并查看数组长度
2021-05-08
JS编写一个函数,计算三个不同数字的大小,按从小到大顺序打印(穷举法)
2021-05-08
技术美术面试问题整理
2021-05-08
C++学习记录 五、C++提高编程(2)
2021-05-08
ORB-SLAM2:LoopClosing线程学习随笔【李哈哈:看看总有收获篇】
2021-05-08
js求阶乘
2021-05-08
简单的xml读取存储方法(未优化)
2021-05-08
Nginx---惊群
2021-05-08
项目中常用的审计类型概述
2021-05-08