【LeetCode笔记】105. 从前序与中序遍历序列构造二叉树(Java、递归、二叉树、哈希表)

文章目录

  • 题目描述
  • 代码 & 思路

题目描述

  • 这题主要是考察前序、后序的性质,以及相互间的关系
    在这里插入图片描述

代码 & 思路

  • 前序:根 - 左 - 右; 中序:左 - 根 - 右,那么用前序数组的首位(即根)的值到中序数组查找对应位置,就可以由此得到左右子树的结点数。
  • 递归进行,每次构造当前根结点,然后开启左、右子树的递归函数即可。
  • 用一次循环来构建<根结点val,中序index>的哈希表,就不用每次都循环查找一次根节点index。
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {/**如何递归?题目要求:给定前序和后序,构造树。既然是前序和后序,那么数组中左子树和右子树一定可以分离成两个连续子数组冲!*/public TreeNode buildTree(int[] preorder, int[] inorder) {// 根据preorder中的一个值,就能找到在inorder中的位置Map<Integer,Integer> map = new HashMap();for(int i=0;i < inorder.length;i++){map.put(inorder[i],i);}return toBuildTree(new TreeNode(),preorder,0,preorder.length-1,inorder,0,inorder.length-1,map);}TreeNode toBuildTree(TreeNode root, int[] preorder, int pL, int pR, int[] inorder, int iL, int iR, Map<Integer,Integer> map){// 找到root.val在inorder中的位置int rootIndex = map.get(preorder[pL]);root = new TreeNode(inorder[rootIndex]);// 左右子树结点数量int leftNum = rootIndex - iL;int rightNum = iR - rootIndex;// 左右子树构建if(leftNum > 0){root.left = toBuildTree(root.left, preorder, pL + 1, pL + leftNum, inorder, iL, rootIndex - 1, map);}if(rightNum > 0){root.right = toBuildTree(root.right, preorder, pL + leftNum + 1, pR, inorder, rootIndex + 1, iR, map);}return root;}
}
  • 无注释版
class Solution {Map<Integer, Integer> hashmap = new HashMap<>();public TreeNode buildTree(int[] preorder, int[] inorder) {for(int i = 0; i < inorder.length; i++) {hashmap.put(inorder[i], i);}return toBuildTree(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);}public TreeNode toBuildTree(int[] preorder, int pL, int pR, int[] inorder, int iL, int iR) {int rootIndex = hashmap.get(preorder[pL]);TreeNode root = new TreeNode(preorder[pL]);int leftNum = rootIndex - iL;int rightNum = iR - rootIndex;if(leftNum > 0) {root.left = toBuildTree(preorder, pL + 1, pL + leftNum, inorder, iL, rootIndex - 1);}if(rightNum > 0) {root.right = toBuildTree(preorder, pL + leftNum + 1, pR, inorder, rootIndex + 1, iR);}return root;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode笔记】114. 二叉树展开为链表(Java、递归)

文章目录题目描述解法 & 思路思路一思路二题目描述 我佛了&#xff0c;这道题挺描述不明的&#xff0c;有坑&#xff0c;过不了oj建议马上看评论 or 题解 解法 & 思路 思路一 代码就不贴了&#xff0c;过不去先序遍历&#xff0c;按序存储val到一个ArrayList。然后用…

【LeetCode笔记】136. 只出现一次的数字(Java、位运算)

文章目录题目描述代码 & 思路题目描述 评论区一个评论很不错&#xff1a;不用额外空间&#xff0c;首先考虑位运算。 代码 & 思路 异或 ^ &#xff1a;相同得0与0得本身满足交换律那么好办了&#xff0c;abcdeabcd > aabbccdde > 0 0 0 0 e > e class So…

linux脚本写的计算器,一步步打造自己的linux命令行计算器

相信很多人&#xff0c;在工作中会需要使用到计算器。一般的做法是&#xff0c;打开并使用系统自带的计算器。这种做法可能对我来说&#xff0c;有如下几个问题。太慢。每次需要打开计算器&#xff0c;然后改成编程模式&#xff0c;手工选择进制&#xff0c;再使用输入表达式进…

【LeetCode笔记】141. 环形链表(Java、快慢指针、链表)

文章目录题目描述思路 & 代码题目描述 常见题&#xff0c;用上了久违的快慢指针 思路 & 代码 举个例子就能明白了&#xff1a;我和汽车&#xff0c;进行一场比赛&#xff0c;跑道可能是环形跑道&#xff0c;也可能是直道。直道的话&#xff0c;将会以汽车撞到终点为…

【LeetCode笔记】169. 多数元素(Java、摩尔投票法、哈希表)

文章目录题目描述思路 & 代码思路一&#xff1a;哈希表思路二&#xff1a; 摩尔投票法题目描述 好家伙&#xff0c;这是今天最有意思的题目了 思路 & 代码 思路一&#xff1a;哈希表 先说缺点&#xff1a;空间复杂度O(n)一次遍历&#xff0c;记录<数组存储值&a…

【LeetCode笔记】206. 反转链表(Java、迭代、递归、链表)

啊好久没更文了&#xff0c;前两天状态不太好。还是要坚持更文敲题噢&#xff01; 文章目录题目描述思路 & 代码题目描述 面试高频题&#xff0c;需要会用两种方法解决&#xff01;&#xff08;迭代 and 递归&#xff09;其实先写出迭代&#xff0c;递归就不难写了。 思…

当你抛弃windows使用linux,当我们厌倦了Windows系统还能考虑什么样的桌面操作系统?...

如果你厌倦了Windows&#xff0c;我们该选择什么样的操作系统&#xff1f;时间告诉我们&#xff0c;任何事物都不会一成不变&#xff0c;当我们厌倦了Windows那天到来&#xff0c;不妨考虑换个操作系统&#xff0c;即便Windows操作系统在市场依然如日中天&#xff0c;旧的不去新…

【LeetCode笔记】234. 回文链表(Java、快慢指针、链表)

文章目录题目描述思路 & 算法题目描述 写这道题前最好把206.翻转链表 写了有空间复杂度的话都好说&#xff0c;不管是新建链表、还是用字符串equals都好做。 思路 & 算法 快慢指针&#xff1a; 快指针找终点&#xff0c;慢指针反转前半个链表快指针回到慢指针的位…

vs2010 编译linux,VS2010 Boost编译安装

2.解压缩到D:\boost 目录下3.编译bjam(1)从vs2010的工具菜单进入命令提示窗口(单击“开始”按钮&#xff0c;指向“所有程序”&#xff0c;指向“Microsoft Visual Studio 2010”&#xff0c;指向“Visual Studio tools(工具)”&#xff0c;然后单击“Visual Studio 2010 comma…

【LeetCode笔记】200. 岛屿数量(Java、DFS)

文章目录题目描述代码 & 思路更新代码题目描述 直接毁岛&#xff01;每次发现一个岛&#xff0c;ans&#xff0c;然后直接把整个岛毁了&#xff08;感染&#xff09;直到最后&#xff0c;找出所有岛&#xff0c;此时地图上全都是’0’ 代码 & 思路 每次找到一个岛&…

【LeetCode笔记】155. 最小栈(Java、栈)

文章目录题目描述思路 & 代码更新版题目描述 用空间换时间的经典例子&#xff0c;唯一要解决的地方就是 getMin() 如何实现常数检索&#xff08;貌似也是面试常考题&#xff09; 思路 & 代码 既然想快&#xff0c;那就要付出空间的代价用什么空间可以实现&#xff…

【LeetCode笔记】198. 打家劫舍(Java、动态规划)

文章目录题目描述思路 & 代码更新版题目描述 好家伙&#xff0c;真是一道不符合社会主义价值观的题目不过我们还是要把这道题做了&#xff0c;而且还得用上动态规划 思路 & 代码 首先&#xff0c;不能打劫相邻然后&#xff0c;房屋都是非负整数&#xff08;讲道理&…

【LeetCode笔记】617. 合并二叉树(Java、DFS、二叉树)

文章目录题目描述思路 & 代码更新版题目描述 貌似是面试高频题&#xff0c;显而易见的递归。 思路 & 代码 合并两棵树&#xff0c;先不考虑特殊情况&#xff0c;可以理解成&#xff1a;根结点合并&#xff0c;然后各自的左右子树继续进行合并操作。那么递归返回值肯…

【LeetCode笔记】226. 翻转二叉树(Java、递归)

文章目录题目描述代码 & 思路更新版题目描述 感觉和合并二叉树类似&#xff0c;都是很好进行递归的问题 代码 & 思路 翻转当前结点的左、右结点对当前结点的左、右结点进行翻转函数【自底向上】 /*** Definition for a binary tree node.* public class TreeNode …

virtualbox linux 分辨率,终于搞定了VirtualBox的ubuntu分辨率问题

曾经装了ubuntu&#xff0c;但是觉得和windows切换太麻烦了&#xff0c;要重启机器&#xff0c;导致的结果是linux装上了总是不用。这次决定使用虚拟机&#xff0c;因为我用ubuntu就是ssh一下实验室的服务器&#xff0c;所以对性能没什么要求。在所里的时候看到祝师兄总用vmwar…

【LeetCode笔记】160. 相交链表(Java、链表)

文章目录题目描述思路 & 代码题目描述 感谢这道题&#xff0c;让我更加了解到Dalao们思路的nb主要是满足空间复杂度O(1)。否则用哈希表不难实现。 思路 & 代码 有相交结点的情况下&#xff0c;可以找到这么一个等式&#xff1a; // 假设链表长度为m&#xff0c;n&…

【LeetCode笔记】152. 乘积最大子数组(Java、动态规划)

文章目录题目描述思路 & 代码更新版题目描述 考虑正数、负数和0的情况 思路 & 代码 既然是使用的动态规划&#xff0c;那么有以下几点&#xff1a; 维护什么&#xff1a;维护iMax和iMin&#xff0c;分别代表包含当前值的子数组的最大乘积 & 最小乘积什么时候转…

Linux安装winetim简单教程,[转载]wine安装最新版TIM

[版权声明&#xff1a;本文为转载&#xff0c;并按照个人实际操作步骤替换为了TIM安装&#xff0c;原文为QQ安装过程。]1. 安装wine本次教程只需要安装最新版本的wine&#xff0c;并不需要winetricks、wine-mono、wine-gecko等其他插件&#xff0c;目前经实际测试发现只运行Win…

【LeetCode笔记】283. 移动零(Java)

文章目录题目描述思路 & 代码更新版题目描述 原地操作 & 减少操作次数&#xff1a;不能直接只拷非零数&#xff0c;也不要每次都一个个推动整个数组 思路 & 代码 维护一个noZeroNums&#xff0c;代表当前循环遇到的非0数的数量第一趟先不管0的数量&#xff0c;…

【LeetCode笔记】448. 找到所有不存在的数(Java、原地)

文章目录题目描述思路 & 代码题目描述 说实话&#xff0c;第一眼看题让我想到那道“往1 &#xff5e; 1024中加入一个数&#xff0c;用中学生也会的方法找到这个数"&#xff08;答案是 (1024! x) - 1024! &#xff09;如果没有时空复杂度限制的话&#xff0c;用哈希…