一、判断二叉树是否为平衡二叉树(时间复杂度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的更多相关文章

  1. (树)判断二叉树是否为BST

    题目:判断一颗二叉树是否为BST. 思路:其实这个问题可以有多个解决方法. 方法一:递归解决.根据BST的特性.左边的小于根节点的值,右边的大于根节点的值.并且对于每一棵子树都是如此.所以我们可以直接 ...

  2. URAL 1136 Parliament 二叉树水题 BST后序遍历建树

    二叉树水题,特别是昨天刚做完二叉树用中序后序建树,现在来做这个很快的. 跟昨天那题差不多,BST后序遍历的特型,找到最后那个数就是根,向前找,比它小的那块就是他的左儿子,比它大的那块就是右儿子,然后递 ...

  3. OptimalSolution(2)--二叉树问题(4)子树与拓扑结构

    一.判断t1树是否包含t2树全部的拓扑结构 1 / \ 2 3 2 / \ / \ / \ 4 5 6 7 4 5 / \ / / 8 9 10 8 返回:true 解法(O(M×N)):如果t1中某 ...

  4. OptimalSolution(2)--二叉树问题(3)Path路径问题

    一.在二叉树中找到累加和为指定值的最长路径长度 给定一棵二叉树和一个32位整数sum,求累加和为sum的最长路径长度.路径是指从某个节点往下,每次最多选择一个孩子节点或者不选所形成的节点链 -3 / ...

  5. 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 ...

  6. 按层次顺序创建二叉树;判断BST

    https://github.com/TouwaErioH/subjects/tree/master/C%2B%2B/PA2 BST 假设已经给定树节点的结构不可修改. 然后输入是按照层次顺序 怎样创 ...

  7. 判断二叉树是否二叉排序树(BST)

    算法思想:由于二叉排序树的中序遍历可以得到一个有序的序列,因此,我们可以使用中序遍历进行求解. 代码如下: #include <stack> using namespace std; ty ...

  8. java实现二叉树查找树

    二叉树(binary)是一种特殊的树.二叉树的每个节点最多只能有2个子节点: 二叉树 由于二叉树的子节点数目确定,所以可以直接采用上图方式在内存中实现.每个节点有一个左子节点(left childre ...

  9. 【转载】图解:二叉搜索树算法(BST)

    原文:图解:二叉搜索树算法(BST) 摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!“岁月极美,在于它必然的流逝”“春花 秋月 夏日 冬雪”— ...

随机推荐

  1. liunx帮助whatis使用方法

           liunx帮助             获取帮助的能力决定了技术的能力! 1.whatis ♢只显示命令的简短描述,相对功能比较单一. [09:42:22 root@centos ~]# ...

  2. 简单python爬虫案例(爬取慕课网全部实战课程信息)

    技术选型 下载器是Requests 解析使用的是正则表达式 效果图: 准备好各个包 # -*- coding: utf-8 -*- import requests #第三方下载器 import re ...

  3. django查询表记录的十三种方法

    django查询表记录的十三种方法 all() 结果为queryset类型 >>> models.Book.objects.all() <QuerySet [<Book: ...

  4. 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?

    摘要: 原创出处 https://studyidea.cn 「公众号:程序通事 」欢迎关注和转载,保留摘要,谢谢! 使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...

  5. python习题作业合集(持续更新……)

    作业: 1.简述位,字节关系 2.请写出“天才”分别用utf-8和gbk编码所占位数 3.如果有一个变量num = 14,请使用int的方法,得到改变量最少可以用多少个二进制位表示 4.写代码,有如下 ...

  6. Android自动跳过app开屏广告

    跳过开屏广告,体验流畅人生 开屏广告 是应用启动时显示的广告,一般右下角(或右下角)有倒计时跳过,不主动点击就会 等待3到5秒 后再进入App 自动跳过 是跳过应用的开屏广告的App 一图胜千文,来我 ...

  7. BERT论文解读

    本文尽量贴合BERT的原论文,但考虑到要易于理解,所以并非逐句翻译,而是根据笔者的个人理解进行翻译,其中有一些论文没有解释清楚或者笔者未能深入理解的地方,都有放出原文,如有不当之处,请各位多多包含,并 ...

  8. mfc CString 转 char *

    做界面时遇到需要从界面编辑框接受输入字符(用户名,密码之类),然后转为char *类型交给程序处理,记录一下找到的方法,主要参考https://blog.csdn.net/neverup_/artic ...

  9. Ubuntu18.04安装好MySQL5.7后,root账号登录密码问题

    不知道从哪个版本开始,在Ubuntu上用apt安装MySQL后,不会提示让你设置密码了. 安装MySQL5.7 sudo apt install mysql-server -y 然后找到MySQL的配 ...

  10. spring boot通过Jedis来操作redis

    idea中新建spring boot项目,引入jedis依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> ...