有苦有乐的算法 --- 判断一颗二叉树是否是完全二叉树、是否是平衡二叉树、是否是搜索二叉树
是否是完全二叉树
完全二叉树:二叉树的每一层要么是满的,要么从左到右处在变满的路上。
public static boolean isCBT(Node head) {if (head == null) {return true;}return process(head).isCBT;
}public static class Info {public boolean isFull;public boolean isCBT;public int height;public Info(boolean full, boolean cbt, int h) {isFull = full;isCBT = cbt;height = h;}
}public static Info process(Node X) {if (X == null) {return new Info(true, true, 0);}Info leftInfo = process(X.left);Info rightInfo = process(X.right);int height = Math.max(leftInfo.height, rightInfo.height) + 1;boolean isFull = leftInfo.isFull && rightInfo.isFull && leftInfo.height == rightInfo.height;boolean isCBT = false;if (isFull) {isCBT = true;} else { // 以x为头整棵树,不满if (leftInfo.isCBT && rightInfo.isCBT) {if (leftInfo.isCBT && rightInfo.isFull && leftInfo.height == rightInfo.height + 1) {isCBT = true;}if (leftInfo.isFull && rightInfo.isFull && leftInfo.height == rightInfo.height + 1) {isCBT = true;}if (leftInfo.isFull && rightInfo.isCBT && leftInfo.height == rightInfo.height) {isCBT = true;}}}return new Info(isFull, isCBT, height);
}
是否是平衡二叉树
平衡二叉树:二叉树的任何一个节点,此节点的左子树高度的右子树的高度差<=1.
public static boolean isBalanced(Node head) {return process(head).isBalanced;
}public static class Info{public boolean isBalanced;public int height;public Info(boolean i, int h) {isBalanced = i;height = h;}
}public static Info process(Node x) {if(x == null) {return new Info(true, 0);}Info leftInfo = process(x.left);Info rightInfo = process(x.right);int height = Math.max(leftInfo.height, rightInfo.height) + 1;boolean isBalanced = true;if(!leftInfo.isBalanced) {isBalanced = false;}if(!rightInfo.isBalanced) {isBalanced = false;}if(Math.abs(leftInfo.height - rightInfo.height) > 1) {isBalanced = false;}return new Info(isBalanced, height);
}
是否是搜索二叉树
搜索二叉树:二叉树的任何一个节点,此节点的左子节点的值小于此节点的值,左子节点的值大于此节点的值
public static boolean isBST(Node head) {if (head == null) {return true;}return process(head).isBST;
}public static class Info {public boolean isBST;public int max;public int min;public Info(boolean i, int ma, int mi) {isBST = i;max = ma;min = mi;}
}public static Info process(Node x) {if (x == null) {return null;}Info leftInfo = process(x.left);Info rightInfo = process(x.right);int max = x.value;if (leftInfo != null) {max = Math.max(max, leftInfo.max);}if (rightInfo != null) {max = Math.max(max, rightInfo.max);}int min = x.value;if (leftInfo != null) {min = Math.min(min, leftInfo.min);}if (rightInfo != null) {min = Math.min(min, rightInfo.min);}boolean isBST = true;if (leftInfo != null && !leftInfo.isBST) {isBST = false;}if (rightInfo != null && !rightInfo.isBST) {isBST = false;}if (leftInfo != null && leftInfo.max >= x.value) {isBST = false;}if (rightInfo != null && rightInfo.min <= x.value) {isBST = false;}return new Info(isBST, max, min);
}
有苦有乐的算法 --- 判断一颗二叉树是否是完全二叉树、是否是平衡二叉树、是否是搜索二叉树相关推荐
- 判断一颗树是否为完全二叉树
题目链接:https://oj.ismdeep.com/contest/problem?id=1396&pid=7 H: CBT? 时间限制: 1 s 内存限制: 128 MB ...
- 有苦有乐的算法 --- 可能有环也可能无环的两个单链表,判断这两个链表是否相交,如果相交返回相交的第一个节点
题目 可能有环也可能无环的两个单链表,判断这两个链表是否相交,如果相交返回相交的第一个节点. 解析 第一步,判断链表是有环链表还是无环链表: 如果一个单链表无环,它一定有一个指向null的尾结点: 如 ...
- 有苦有乐的算法 --- 有序数组中的元素存在问题、最左元素问题和无序数组局部最小问题
一个有序数组,判断是否含有一个元素 解析: 给定一个数组 如果需要判断是否存在的元素为3. 首先找到数组的中间元素: 如果此元素为3,结束: 如果不是,此元素与3比较,此元素如果大于3,在从此元素左边 ...
- 有苦有乐的算法 --- 并查集的实现原理
假如有两个集合: 找出一个节点作为集合的'头',集合内的其他节点都与这个'头'进行关联(可以直接找到这个'头'); 如果需要在集合A中查找一个元素是否存在,或者判断两个元素是否属于同一集合,只需判断它 ...
- 有苦有乐的算法 --- 一个数组中,有两种数出现了奇数次,其余数都出现了偶数次,找到这两种数
题目 一个数组中,有两种数出现了奇数次,其余数都出现了偶数次,找到这两组数 例: [2,4,3,2,5,4] ⇒ [3,5] [1,4,6,3,7,8,3,2,1,2,6,6,7,8] ⇒ [6,4] ...
- 有苦有乐的算法 --- 获取二叉树的最大宽度
题目 一颗二叉树,求其最大宽度. 例: 解析 按层遍历二叉树: 在遍历时,使用用4个变量来记录信息: Node curEnd = null; // 当前层,最右节点是谁 Node nextEnd = ...
- 有苦有乐的算法 --- 基数排序
题目 一个无序数组,使用基数排序的方式从小到大进行排序 解析 给定一个数组: 首先准备一个"桶"(每个桶是一个队列): 从左到右遍历数组,每个元素的个位数是多少,就进入几号桶中: ...
- 有苦有乐的算法 --- 随机快排
题目 使用随机快排对给定数组进行从小到大排序 [5,3,2,1,5] ⇒ [1,2,3,5,5] 解析 给定一个数组 1.在数组中找出一个数作为基准(最右侧的数2):变量l记录数组头位置,变量r记录尾 ...
- 有苦有乐的算法 --- 小和问题
题目 一个无序数组,获取每个元素在左面比这个元素小的个数,求这些个数的和 例: [3,2,5,1,4] ==> 6 [4,7,0,8,2,4,9,4] ==> 14 解析 准备一个无序数组 ...
最新文章
- Grunt-几个常用的任务配置,加载,执行的写法
- SAP MM 特殊库存之T库存
- 修改mysql用户名密码
- 修改 Oracle 数据库 sequence(序列) 的 increment (步长)
- PHP中过滤常用标签的正则表达式
- 360笔试第一题----最强的不一定是最后的赢家
- pdf文档遇到了共享冲突_如何将链接共享为PDF格式的Google文档链接
- Educational Codeforces Round 104 (Rated for Div. 2)A~E解题报告
- 创业编程七个错误认识
- linux mvn m2目录,Maven C盘用户文件下没有.m2
- chapter1.4.4
- 机器学习笔记(二十九):决策树、信息熵
- 疑难杂症 | Win10解压文件后乱码
- python连接FTP服务器
- GitHub Copilot 自动写代码插件使用体验
- 洛谷P1512伊甸园的日历游戏题解
- 微信小程序怎么用?小程序有什么用?之501~600
- dataV实现扇形图轮播
- 智铺子微信扫码点餐系统有哪些可操作的功能
- APP是怎么做出来的呢?
热门文章
- 服务器所属文件变成nobody,NFS使用autofs挂接后文件属主显示为nobody
- java实现飞机大战小游戏——————【附素材、源码、逐行注释讲解】
- PowerMILL宏自动化编程教程
- 变压器直流电阻测试仪RS485串口数据采集接入数据库及MESERP系统方案
- 全球最大电音音乐节Tomorrowland | FTX Europe将与电子音乐节Tomorrowland合作
- 【Python】字节码与dis模块
- 第三部分 基本库的使用(urllib库, requests库, re库)
- 计算机应用技术专业名词解释,计算机应用技术名词解释--02316(26页)-原创力文档...
- 检测整数是否含有7 或 是7的倍数
- 1到50中7的倍数的数值之和