数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树
数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树
目录
- 判断一棵树是否为搜索二叉树
- 判断一棵树是否是完全二叉树
1. 判断一棵树是否为搜索二叉树
- 概念:搜索树就是中序遍历的结果是升序,就是搜索二叉树。如下图
- 我们可以改中序遍历非递归版,在打印时机换成比较。即如代码为中序遍历非递归版
public static void inOrderUnRecur(Node head) {System.out.print("in-order: ");if (head != null) {Stack<Node> stack = new Stack<Node>();while (!stack.isEmpty() || head != null) {if (head != null) {stack.push(head);head = head.left;} else {head = stack.pop();System.out.print(head.value + " ");head = head.right;}}}System.out.println();}
我们设置一个变量记录当前值,和后一个需要打印的值比较,如果前一个值大于后一个值,即不是搜索二叉树,则返回false。改后的搜索二叉树代码为:
public static boolean isBST1(Node head) {if (head != null) {Stack<Node> stack = new Stack<>();int pre = 0;while (!stack.isEmpty() || head != null) {if (head != null) {stack.push(head);head = head.left;} else {head = stack.pop();if (pre<=head.value){pre = head.value;}else {return false;}head = head.right;}}}return true;}
另外一种搜索二叉树的代码
public static boolean isBST2(Node head) {if (head == null) {return true;}boolean res = true;Node pre = null;Node cur1 = head;Node cur2 = null;while (cur1 != null) {cur2 = cur1.left;if (cur2 != null) {while (cur2.right != null && cur2.right != cur1) {cur2 = cur2.right;}if (cur2.right == null) {cur2.right = cur1;cur1 = cur1.left;continue;} else {cur2.right = null;}}if (pre != null && pre.value > cur1.value) {res = false;}pre = cur1;cur1 = cur1.right;}return res;}
2. 判断一棵树是否是完全二叉树
思路
- 如果有右孩子,没有左孩子,那肯定不是完全二叉树
- 当第一次发现左右两个孩子不是双全的时候,后面遍历到的节点全部都是叶节点,否则返回false
流程
- 判断head是否为null,如果为null返回true,否则创建一个队列和创建一个布尔值leaf,表示判断是否开启叶子阶段
- 当队列不为null时,从队列弹出一个数,然后获取左右节点。
- 判断:如果左孩子为null,右孩子不为null,或者开启叶子判断并且左孩子节点或者右孩子节点不为null,则返回false。
- 如果左节点不为null,加入队列。如果右节点不为null,加入队列。
- 如果左节点为null或者右节点为null,则开启叶子判断。
代码实现
public static boolean isCBT(Node head) {if (head == null) {return true;}Queue<Node> queue = new LinkedList<Node>();boolean leaf = false;Node l = null;Node r = null;queue.offer(head);while (!queue.isEmpty()) {head = queue.poll();l = head.left;r = head.right;if ((leaf && (l != null || r != null)) || (l == null && r != null)) {return false;}if (l != null) {queue.offer(l);}if (r != null) {queue.offer(r);}if (l == null || r == null) {leaf = true;}}return true;}
数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树相关推荐
- 判断一棵树是否是搜索二叉树 判断一棵树是否是完全二叉树
package class_04;import java.util.LinkedList; import java.util.Queue; /*** * 判断一棵树是否是搜索二叉树* 判断一棵树是否是 ...
- 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 优先级队列 — 左高树
<数据结构.算法与应用 -- C++语言描述>学习笔记 - 优先级队列 - 左高树 一.左高树 1.外部节点 2.高度优先左高树 (1)定义 (2)特性 (3)HBLT 与 大小根树 3. ...
- C++(数据结构与算法):42---优先级队列的实现(扩充二叉树、高度优先左高树(HBLT)、重量优先左高树(WBLT))
本文代码下载: 方式1:公众号[多栖技术控小董]回复[3586]免费获取下载链接 方式2:CSDN下载链接:https://download.csdn.net/download/qq_41453285 ...
- 树和森林与二叉树的转换、树和森林的遍历
全部数据结构.算法及应用课内模板请点击:https://blog.csdn.net/weixin_44077863/article/details/101691360 树和森林转二叉树其实十分简单,我 ...
- 算法-判断一颗树是否是搜索二叉树
定义:(二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点 ...
- 【数据结构与算法】之深入解析“删除二叉搜索树中的节点”的求解思路与算法示例
一.题目要求 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变,返回二叉搜索树(有可能被更新)的根节点的引用. 一般来说,删除 ...
- 数据结构与算法:树与二叉树python实现
最近复习一遍数据结构与算法,做一些笔记,大家可以一起复习. 一.树的一些容易混淆的定义: 结点层:根结点的层定义为1:根的孩子为第二层结点,依此类推: 树的深度(或高度):树中最大的结点层: 满二叉树 ...
- 数据结构与算法学习笔记-树和二叉树
声明:本博客仅为本人学习途中做的笔记 采自青岛大学王卓老师的视频教学 主要内容为算法思路,具体代码实现还需修改后才能运行,望各位看官多多包涵,您的点赞与评论是对我最大的肯定! 1.树和二叉树的定义 数 ...
- 如何判断一棵树是否是满二叉树
判断一棵树是否是满二叉树 1.满二叉树定义 2.如何判断一棵树是否是满二叉树 3.代码 1.满二叉树定义 除最后一层无子节点外,其他层的所有节点都有两个子节点的二叉树就是满二叉树.如下图所示: 2.如 ...
最新文章
- 继中美之后,欧盟会成为下一个 AI 超级体吗?
- matlab dsearchn,cKDTree与dsearchn
- 蓝牙怎么实现传输的_不知道手机蓝牙有啥用?1分钟带你了解蓝牙这6种用法!涨知识啦...
- Device Tree(二):基本概念
- 2020-11-11(对话框简单总结)
- linux系统页面缓存,Linux缓存机制之页缓存
- 注意力机制可视化_Attention isn’t all you need!BERT的力量之源远不止注意力
- mysql explain 结果值介绍
- AndroidStudio 开发基础知识【翻译完成】
- mysql string agg_postgresql – 如何使array_agg()像mySQL中的group_concat()一样工作
- 【图像处理】RGB各种格式
- 华为终端穿戴软件测试,【华为终端测试面试】说说群面,可谓是 最...-看准网...
- 程序员如何学习一门新技术?
- paypal支付注意事项
- 【华为OD】【001-勾股数元组】
- ios 获取是否静音模式_iOS 判断设备是否静音
- extract($_POST, EXTR_SKIP)讲解
- Elasticsearch:在搜索引擎中如何实现完全匹配(内容精确匹配)查询
- 融入动画技术的粒子效果文字动画交互应用
- MySQL权限与安全管理之权限表与账户管理
热门文章
- vue.js的一些小语法v-bind,v-if,v-show,v-else
- 内存映射MMAP和DMA【转】
- 网站防止SQL注入方法
- [LeetCode] Find Largest Value in Each Tree Row 找树每行最大的结点值
- linux硬件时间修改与查看
- Ubuntu 12.04: virtualenv下安装 numpy, scipy, matpl...
- TCP中的Flag options
- CodeForces - 1343D Constant Palindrome Sum(思维+差分数组)
- 3_3 ObserverMode 观察者模式
- 使用SQLite3存储和读取数据