是否是完全二叉树

完全二叉树:二叉树的每一层要么是满的,要么从左到右处在变满的路上。

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);
}

有苦有乐的算法 --- 判断一颗二叉树是否是完全二叉树、是否是平衡二叉树、是否是搜索二叉树相关推荐

  1. 判断一颗树是否为完全二叉树

    题目链接:https://oj.ismdeep.com/contest/problem?id=1396&pid=7 H: CBT? 时间限制: 1 s      内存限制: 128 MB    ...

  2. 有苦有乐的算法 --- 可能有环也可能无环的两个单链表,判断这两个链表是否相交,如果相交返回相交的第一个节点

    题目 可能有环也可能无环的两个单链表,判断这两个链表是否相交,如果相交返回相交的第一个节点. 解析 第一步,判断链表是有环链表还是无环链表: 如果一个单链表无环,它一定有一个指向null的尾结点: 如 ...

  3. 有苦有乐的算法 --- 有序数组中的元素存在问题、最左元素问题和无序数组局部最小问题

    一个有序数组,判断是否含有一个元素 解析: 给定一个数组 如果需要判断是否存在的元素为3. 首先找到数组的中间元素: 如果此元素为3,结束: 如果不是,此元素与3比较,此元素如果大于3,在从此元素左边 ...

  4. 有苦有乐的算法 --- 并查集的实现原理

    假如有两个集合: 找出一个节点作为集合的'头',集合内的其他节点都与这个'头'进行关联(可以直接找到这个'头'); 如果需要在集合A中查找一个元素是否存在,或者判断两个元素是否属于同一集合,只需判断它 ...

  5. 有苦有乐的算法 --- 一个数组中,有两种数出现了奇数次,其余数都出现了偶数次,找到这两种数

    题目 一个数组中,有两种数出现了奇数次,其余数都出现了偶数次,找到这两组数 例: [2,4,3,2,5,4] ⇒ [3,5] [1,4,6,3,7,8,3,2,1,2,6,6,7,8] ⇒ [6,4] ...

  6. 有苦有乐的算法 --- 获取二叉树的最大宽度

    题目 一颗二叉树,求其最大宽度. 例: 解析 按层遍历二叉树: 在遍历时,使用用4个变量来记录信息: Node curEnd = null; // 当前层,最右节点是谁 Node nextEnd = ...

  7. 有苦有乐的算法 --- 基数排序

    题目 一个无序数组,使用基数排序的方式从小到大进行排序 解析 给定一个数组: 首先准备一个"桶"(每个桶是一个队列): 从左到右遍历数组,每个元素的个位数是多少,就进入几号桶中: ...

  8. 有苦有乐的算法 --- 随机快排

    题目 使用随机快排对给定数组进行从小到大排序 [5,3,2,1,5] ⇒ [1,2,3,5,5] 解析 给定一个数组 1.在数组中找出一个数作为基准(最右侧的数2):变量l记录数组头位置,变量r记录尾 ...

  9. 有苦有乐的算法 --- 小和问题

    题目 一个无序数组,获取每个元素在左面比这个元素小的个数,求这些个数的和 例: [3,2,5,1,4] ==> 6 [4,7,0,8,2,4,9,4] ==> 14 解析 准备一个无序数组 ...

最新文章

  1. Grunt-几个常用的任务配置,加载,执行的写法
  2. SAP MM 特殊库存之T库存
  3. 修改mysql用户名密码
  4. 修改 Oracle 数据库 sequence(序列) 的 increment (步长)
  5. PHP中过滤常用标签的正则表达式
  6. 360笔试第一题----最强的不一定是最后的赢家
  7. pdf文档遇到了共享冲突_如何将链接共享为PDF格式的Google文档链接
  8. Educational Codeforces Round 104 (Rated for Div. 2)A~E解题报告
  9. 创业编程七个错误认识
  10. linux mvn m2目录,Maven C盘用户文件下没有.m2
  11. chapter1.4.4
  12. 机器学习笔记(二十九):决策树、信息熵
  13. 疑难杂症 | Win10解压文件后乱码
  14. python连接FTP服务器
  15. GitHub Copilot 自动写代码插件使用体验
  16. 洛谷P1512伊甸园的日历游戏题解
  17. 微信小程序怎么用?小程序有什么用?之501~600
  18. dataV实现扇形图轮播
  19. 智铺子微信扫码点餐系统有哪些可操作的功能
  20. APP是怎么做出来的呢?

热门文章

  1. 服务器所属文件变成nobody,NFS使用autofs挂接后文件属主显示为nobody
  2. java实现飞机大战小游戏——————【附素材、源码、逐行注释讲解】
  3. PowerMILL宏自动化编程教程
  4. 变压器直流电阻测试仪RS485串口数据采集接入数据库及MESERP系统方案
  5. 全球最大电音音乐节Tomorrowland | FTX Europe将与电子音乐节Tomorrowland合作
  6. 【Python】字节码与dis模块
  7. 第三部分 基本库的使用(urllib库, requests库, re库)
  8. 计算机应用技术专业名词解释,计算机应用技术名词解释--02316(26页)-原创力文档...
  9. 检测整数是否含有7 或 是7的倍数
  10. 1到50中7的倍数的数值之和