数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树


目录

  1. 判断一棵树是否为搜索二叉树
  2. 判断一棵树是否是完全二叉树

1. 判断一棵树是否为搜索二叉树

  1. 概念:搜索树就是中序遍历的结果是升序,就是搜索二叉树。如下图
  2. 我们可以改中序遍历非递归版,在打印时机换成比较。即如代码为中序遍历非递归版
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. 判断一棵树是否是完全二叉树

  1. 思路

    1. 如果有右孩子,没有左孩子,那肯定不是完全二叉树
    2. 当第一次发现左右两个孩子不是双全的时候,后面遍历到的节点全部都是叶节点,否则返回false
  2. 流程

    1. 判断head是否为null,如果为null返回true,否则创建一个队列和创建一个布尔值leaf,表示判断是否开启叶子阶段
    2. 当队列不为null时,从队列弹出一个数,然后获取左右节点。
    3. 判断:如果左孩子为null,右孩子不为null,或者开启叶子判断并且左孩子节点或者右孩子节点不为null,则返回false。
    4. 如果左节点不为null,加入队列。如果右节点不为null,加入队列。
    5. 如果左节点为null或者右节点为null,则开启叶子判断。
  3. 代码实现

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

数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树相关推荐

  1. 判断一棵树是否是搜索二叉树 判断一棵树是否是完全二叉树

    package class_04;import java.util.LinkedList; import java.util.Queue; /*** * 判断一棵树是否是搜索二叉树* 判断一棵树是否是 ...

  2. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 优先级队列 — 左高树

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 优先级队列 - 左高树 一.左高树 1.外部节点 2.高度优先左高树 (1)定义 (2)特性 (3)HBLT 与 大小根树 3. ...

  3. C++(数据结构与算法):42---优先级队列的实现(扩充二叉树、高度优先左高树(HBLT)、重量优先左高树(WBLT))

    本文代码下载: 方式1:公众号[多栖技术控小董]回复[3586]免费获取下载链接 方式2:CSDN下载链接:https://download.csdn.net/download/qq_41453285 ...

  4. 树和森林与二叉树的转换、树和森林的遍历

    全部数据结构.算法及应用课内模板请点击:https://blog.csdn.net/weixin_44077863/article/details/101691360 树和森林转二叉树其实十分简单,我 ...

  5. 算法-判断一颗树是否是搜索二叉树

    定义:(二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点 ...

  6. 【数据结构与算法】之深入解析“删除二叉搜索树中的节点”的求解思路与算法示例

    一.题目要求 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变,返回二叉搜索树(有可能被更新)的根节点的引用. 一般来说,删除 ...

  7. 数据结构与算法:树与二叉树python实现

    最近复习一遍数据结构与算法,做一些笔记,大家可以一起复习. 一.树的一些容易混淆的定义: 结点层:根结点的层定义为1:根的孩子为第二层结点,依此类推: 树的深度(或高度):树中最大的结点层: 满二叉树 ...

  8. 数据结构与算法学习笔记-树和二叉树

    声明:本博客仅为本人学习途中做的笔记 采自青岛大学王卓老师的视频教学 主要内容为算法思路,具体代码实现还需修改后才能运行,望各位看官多多包涵,您的点赞与评论是对我最大的肯定! 1.树和二叉树的定义 数 ...

  9. 如何判断一棵树是否是满二叉树

    判断一棵树是否是满二叉树 1.满二叉树定义 2.如何判断一棵树是否是满二叉树 3.代码 1.满二叉树定义 除最后一层无子节点外,其他层的所有节点都有两个子节点的二叉树就是满二叉树.如下图所示: 2.如 ...

最新文章

  1. 继中美之后,欧盟会成为下一个 AI 超级体吗?
  2. matlab dsearchn,cKDTree与dsearchn
  3. 蓝牙怎么实现传输的_不知道手机蓝牙有啥用?1分钟带你了解蓝牙这6种用法!涨知识啦...
  4. Device Tree(二):基本概念
  5. 2020-11-11(对话框简单总结)
  6. linux系统页面缓存,Linux缓存机制之页缓存
  7. 注意力机制可视化_Attention isn’t all you need!BERT的力量之源远不止注意力
  8. mysql explain 结果值介绍
  9. AndroidStudio 开发基础知识【翻译完成】
  10. mysql string agg_postgresql – 如何使array_agg()像mySQL中的group_concat()一样工作
  11. 【图像处理】RGB各种格式
  12. 华为终端穿戴软件测试,【华为终端测试面试】说说群面,可谓是 最...-看准网...
  13. 程序员如何学习一门新技术?
  14. paypal支付注意事项
  15. 【华为OD】【001-勾股数元组】
  16. ios 获取是否静音模式_iOS 判断设备是否静音
  17. extract($_POST, EXTR_SKIP)讲解
  18. Elasticsearch:在搜索引擎中如何实现完全匹配(内容精确匹配)查询
  19. 融入动画技术的粒子效果文字动画交互应用
  20. MySQL权限与安全管理之权限表与账户管理

热门文章

  1. vue.js的一些小语法v-bind,v-if,v-show,v-else
  2. 内存映射MMAP和DMA【转】
  3. 网站防止SQL注入方法
  4. [LeetCode] Find Largest Value in Each Tree Row 找树每行最大的结点值
  5. linux硬件时间修改与查看
  6. Ubuntu 12.04: virtualenv下安装 numpy, scipy, matpl...
  7. TCP中的Flag options
  8. CodeForces - 1343D Constant Palindrome Sum(思维+差分数组)
  9. 3_3 ObserverMode 观察者模式
  10. 使用SQLite3存储和读取数据