LeeCode 二叉树问题(二)
二叉树的构建
LeeCode 106: 从中序遍历与后续遍历序列构造二叉树
题目描述
给定两个整数数组
inorder和postorder,其中inorder是二叉树的中序遍历,postorder是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
建立模型
中序遍历和后续遍历数组可以唯一确定二叉树。
中序遍历数组:[左,根,右]
后续遍历数组:[左,右,根]
- 通过后续遍历数组获取根节点的值,然后在中序遍历中找到根节点的下标
- 通过根节点的下标与数组的左边界计算左子树节点的个数
- 递归地构造左右子树
代码实现
public TreeNode buildTree(int[] inorder, int[] postorder) {
}
// 包含左边界,不包含右边界 [inStart, inEnd)
public TreeNode buildTreeImpl(int[] inorder, int inStart, int inEnd, int[] postorder, int postStart, int postEnd) {
if (inStart >= inEnd) {
return null;
}
int rootVal = postorder[postEnd - 1];
TreeNode root = new TreeNode(rootVal);
int rootInorderIndex = 0;
for (int i = inStart, i < inEnd; i++) {
if (inorder[i] == root.val) {
rootInorderIndex = i;
break;
}
}
int leftTreeSize = rootInorderIndex - inStart;
root.left = buildTreeImpl(inorder, inStart, rootInorderIndex, postorder, postStart, postStart + leftTreeSize);
root.right = buildTreeImpl(inorder, rootInorderIndex + 1, inEnd, postorder, postStart + leftTreeSize, postEnd - 1);
}
LeeCode 654: 最大二叉树
题目描述
给定一个不重复的整数数组
nums。最大二叉树可以用下面的算法从nums递归地构建:
- 创建一个根节点,其值为
nums中的最大值。- 递归地在最大值左边的子数组前缀上构建左子树
- 递归地在最大值右边的子数组后缀上构建右子树
返回
nums构建的最大二叉树。
代码实现
public TreeNode constructMaximumBinaryTree(int[] nums) {
}
public TreeNode constructMaximumBinaryTreeImpl(int[] nums, int start, int end) {
if (start >= end) {
return null;
}
int rootVal = Integer.MIN_VALUE;
int rootIndex = 0;
for (int i = start, i < end; i++) {
if (nums[i] > rootVal) {
rootVal = nums[i];
rootIndex = i;
}
}
// 构造根节点
TreeNode root = new TreeNode(rootVal);
root.left = constructMaximumBinaryTreeImpl(nums, start, rootIndex);
root.right = constructMaximumBinaryTreeImpl(nums, rootIndex + 1, end);
return root;
}
LeeCode 二叉树问题(二)的更多相关文章
- 二叉树的二叉链表存储结构及C++实现
前言:存储二叉树的关键是如何表示结点之间的逻辑关系,也就是双亲和孩子之间的关系.在具体应用中,可能要求从任一结点能直接访问到它的孩子. 一.二叉链表 二叉树一般多采用二叉链表(binary linke ...
- leecode第一百二十四题(二叉树中的最大路径和)
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...
- 【转载】Morris遍历二叉树 & BST(二叉搜索树) Traverse & 空间O(1) 时间O(n)
因为做一道Leetcode的题目(前面博客有:link),需要用Space O(1)空间复杂度来中序遍历树, 看了Discuss,也上网搜了一下,发现空间O(1)可以用 Morris遍历的方法.方法介 ...
- C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)
今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...
- 二叉树、二叉搜索树、平衡二叉树、B树、B+树的精确定义和区别探究
概述 关于树的概念很多,B树,B+树,红黑树等等. 但是你去翻翻百度百科,或者用百度或者谷歌搜索一下中文的树结构的介绍,全都是狗屁.没有哪个中文网站是真正精确解释树的定义的,尤其是百度百科. 下面我要 ...
- 数据结构中的树(二叉树、二叉搜索树、AVL树)
数据结构动图展示网站 树的概念 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有 ...
- 二叉树(二叉链表实现)JAVA代码
publicclassTest{ publicstaticvoid main(String[] args){ char[] ch =newchar[]{'A','B ...
- 二叉树系列 - 二叉搜索树 - [LeetCode] 中序遍历中利用 pre节点避免额外空间。题:Recover Binary Search Tree,Validate Binary Search Tree
二叉搜索树是常用的概念,它的定义如下: The left subtree of a node contains only nodes with keys less than the node's ke ...
- B-Tree 漫谈 (从二叉树到二叉搜索树到平衡树到红黑树到B树到B+树到B*树)
关于B树的学习还是需要做点笔记. B树是为磁盘或者其他直接存取辅助存储设备而设计的一种平衡查找树.B树与红黑树的不同在于,B树可以有很多子女,从几个到几千个.比如一个分支因子为1001,高度为2的B树 ...
- C语言刷二叉树(二)基础部分
102. 二叉树的层序遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeN ...
随机推荐
- 项目引入fastclick 导致ios中input需要多次点击才能触发focus
main.js中引入之后的修改 import FastClick from "fastclick"; FastClick.prototype.focus = function (t ...
- css穿透
https://www.cnblogs.com/linjiangxian/p/13183412.html
- Web_Servlet和jsp页面数据交互,通过请求转发在jsp中显示数据
1.Servlet页面代码 /* 实现jsp页面和sevlet页面的信息交互 */ @WebServlet(urlPatterns = "/aa") public class Js ...
- 禁止的回文子串 Dyslexic Gollum
UVA1633 一个长的回文串都可以由短的回文串拓展而来,只要短的回文在左右两端增加相同的字符即可.因此,在考虑长度为NNN的01串时,只要在从长度为1向NNN拓展的过程中,保证后KKK个字符不是回文 ...
- Spring 笔记三 AOP
1.AOP 概述 AOP (Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统 OOP (Object-Oriented Programming,面 ...
- JavaScript基础学习之二
目录 JavaScript HTML DOM事件 事件触发1 事件触发2 addEventListener() 事件冒泡或事件捕获? 事件委托 removeEventListener() 方法 事件对 ...
- 转 oracle 无法使用sys用户登录 connection as SYS should be as SYSDBA OR SYSOPER
转自: https://blog.csdn.net/u012004128/article/details/80781979 安装Oracle11g后,为了测试安装是否成功,通过cmd命令打开了sql ...
- hi,docker,docker的介绍
一.docker的介绍 1.什么是docker: docker是一种虚拟化技术,小型的系统环境(linux)2.虚拟化技术: 在计算机中用例管理虚拟资源的一种手段 内存管理.软件虚拟化.硬件虚拟化(磁 ...
- Pytorch中tensor的打印精度
1. 设置打印精 Pytorch中tensor打印的数据长度需要使用torch.set_printoptions(precision=xx)进行设置,否则打印的长度会很短,给人一种精度不够的错觉: & ...
- 之前学的yield
生成器&迭代器 生成器的特性1.生成器是一个有yield关键字的函数对象,yield暂停并保存并返回调用结果2.第一次通过next开始运行这个函数,以后每次next就从yield开始继续运行函 ...