OptimalSolution(2)--二叉树问题(2)BST、BBT、BSBT
一、判断二叉树是否为平衡二叉树(时间复杂度O(N))
平衡二叉树就是:要么是一棵空树,要么任何一个节点的左右子树高度差的绝对值不超过1。
解法:整个过程为二叉树的后序遍历。对任何一个节点node来说,先遍历node的左子树,遍历过程中收集两个信息,一个是node的左子树是否为平衡二叉树,一个是node的左子树最深到哪一层即为lH。如果发现node的左子树不是平衡二叉树,无须进行后续过程。如果node的左子树是平衡二叉树,在遍历node的右子树,同样收集两个信息。如果node的右子树也是平衡二叉树,就看lH和rH的绝对值是否大于1。如果大于1,就说明不是平衡二叉树。
注意:这里只能用boolean[] res而不能用boolean res做全局变量,如果boolean做全局变量会有问题。
- public boolean isBalance(Node root) {
- boolean[] res = new boolean[1];
- res[0] = true;
- getHeight(root, 1, res);
- return res[0];
- }
- private int getHeight(Node root, int level, boolean[] res) {
- if (root == null) return level;
- int lH = getHeight(root.left, level + 1, res);
- if (!res[0]) return level;
- int rH = getHeight(root.right, level + 1, res);
- if (!res[0]) return level;
- if (Math.abs(lH - rH) > 1) res[0] = false;
- return Math.max(lH, rH);
- }
二、根据有序数组生成平衡搜索二叉树,并且该搜索二叉树的中序遍历的结果与有序数组一致
解法:用有序数组汇总最中间的数生成搜索二叉树的头节点,然后用这个数左边的数生成左子树,右边的数生成右子树即可。
- public TreeNode sortedArrayToBST(int[] nums) {
- if (nums == null) return null;
- return generateNode(nums, 0, nums.length - 1);
- }
- private TreeNode generateNode(int[] nums, int start, int end) {
- if (start > end) return null;
- int mid = (start + end) / 2;
- TreeNode root = new TreeNode(nums[mid]);
- root.left = generateNode(nums, start, mid - 1);
- root.right = generateNode(nums, mid + 1, end);
- return root;
- }
三、
OptimalSolution(2)--二叉树问题(2)BST、BBT、BSBT的更多相关文章
- (树)判断二叉树是否为BST
题目:判断一颗二叉树是否为BST. 思路:其实这个问题可以有多个解决方法. 方法一:递归解决.根据BST的特性.左边的小于根节点的值,右边的大于根节点的值.并且对于每一棵子树都是如此.所以我们可以直接 ...
- URAL 1136 Parliament 二叉树水题 BST后序遍历建树
二叉树水题,特别是昨天刚做完二叉树用中序后序建树,现在来做这个很快的. 跟昨天那题差不多,BST后序遍历的特型,找到最后那个数就是根,向前找,比它小的那块就是他的左儿子,比它大的那块就是右儿子,然后递 ...
- OptimalSolution(2)--二叉树问题(4)子树与拓扑结构
一.判断t1树是否包含t2树全部的拓扑结构 1 / \ 2 3 2 / \ / \ / \ 4 5 6 7 4 5 / \ / / 8 9 10 8 返回:true 解法(O(M×N)):如果t1中某 ...
- OptimalSolution(2)--二叉树问题(3)Path路径问题
一.在二叉树中找到累加和为指定值的最长路径长度 给定一棵二叉树和一个32位整数sum,求累加和为sum的最长路径长度.路径是指从某个节点往下,每次最多选择一个孩子节点或者不选所形成的节点链 -3 / ...
- OptimalSolution(2)--二叉树问题(1)遍历与查找问题
一.二叉树的按层打印与ZigZag打印 1.按层打印: 1 Level 1 : 1 / \ 2 3 Level 2 : 2 3 / / \ 4 5 6 Level 3 : 4 5 6 / \ 7 8 ...
- 按层次顺序创建二叉树;判断BST
https://github.com/TouwaErioH/subjects/tree/master/C%2B%2B/PA2 BST 假设已经给定树节点的结构不可修改. 然后输入是按照层次顺序 怎样创 ...
- 判断二叉树是否二叉排序树(BST)
算法思想:由于二叉排序树的中序遍历可以得到一个有序的序列,因此,我们可以使用中序遍历进行求解. 代码如下: #include <stack> using namespace std; ty ...
- java实现二叉树查找树
二叉树(binary)是一种特殊的树.二叉树的每个节点最多只能有2个子节点: 二叉树 由于二叉树的子节点数目确定,所以可以直接采用上图方式在内存中实现.每个节点有一个左子节点(left childre ...
- 【转载】图解:二叉搜索树算法(BST)
原文:图解:二叉搜索树算法(BST) 摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!“岁月极美,在于它必然的流逝”“春花 秋月 夏日 冬雪”— ...
随机推荐
- 基于操作系统原理的Linux 系统的安装
一.实验目的 1.了解Linux操作系统的发行版本. 2.掌握Red Hat Linux 9.0的安装方法. (可用Red Hat Linux 5.0版本替代9.0版本) 3.了解Linux其他版本( ...
- Oozie、Flume、Mahout配置与应用
-------------------------Oozie-------------------- [一.部署] 1)部署Oozie服务端 [root@cMaster~]#sudo yum inst ...
- logrotate 不生效
登录服务器查看,发现日志没有自动切割.去查看micros配置文件: [root@ecs-11-151 ~]# cat /etc/logrotate.d/micros /data/logs/*/*.lo ...
- bootstrap具体知识点(2)
3.以移动设备为优先 <meta name=”viewport” content=”width=device-width,initial-scale=1,user-scalable=no”> ...
- MySQL InnoDB如何保证事务特性
如果有人问你"数据库事务有哪些特性"?你可能会很快回答出原子性.一致性.隔离性.持久性即ACID特性.那么你知道InnoDB如何保证这些事务特性的吗?如果知道的话这篇文章就可以直接 ...
- Java 学习笔记之 线程isInterrupted方法
线程isInterrupted方法: isInterrupted()是Thread对象的方法,测试线程是否已经中断. public class ThreadRunMain { public stati ...
- 2.css3表示颜色的几种方式
1.css3中表示颜色的几种方式: ⑴颜色名称.十六进制.RGB方式: ⑵RGBA方式:新增了alpha参数,介于0.0(完全透明)到1.0(完全不透明)之间: ⑶HSL方式:分别表示色调.饱和度.亮 ...
- 旧瓶新酒-获取网络资源即爬取下载页面内容(图片、html、css、js等)
这个java获取网络资源以前也写过不少 最近用到又重新写了一个,apache.commons.io中的例子就非常好,但是无法对请求进行详细设置 于是大部分照搬,局部替换以设置请求头 如需更加复杂的设置 ...
- 用go语言爬取珍爱网 | 第一回
我们来用go语言爬取"珍爱网"用户信息. 首先分析到请求url为: http://www.zhenai.com/zhenghun 接下来用go请求该url,代码如下: packag ...
- go 学习笔记之解读什么是defer延迟函数
Go 语言中有个 defer 关键字,常用于实现延迟函数来保证关键代码的最终执行,常言道: "未雨绸缪方可有备无患". 延迟函数就是这么一种机制,无论程序是正常返回还是异常报错,只 ...