算法体系-13 第十三 二叉树的基本算法+二叉树的递归套路

一 完全二叉树的判断

1.1 描述

完全二叉树:他每一层都是满的,即使不满也是最后一层不满,最后一层不满也是从左到右变满的;话句话说就是

完全二叉树从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐

1.如果是最后一层,下一轮还有

2.不是从左往右排

判断的时候按层遍历

1、如果某个节点有右孩子,没有左孩子返回false;

2、当越到第一次越到左右孩子不双全的情况下说明这层已经是最后一层既叶子节点,那么接下来的遍历就不能再出现左节点或者有节点有的话就不是;

1.3 代码

public class Code01_IsCBT {public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value = data;}}public static boolean isCBT1(Node head) {if (head == null) {return true;}LinkedList<Node> queue = new LinkedList<>();// 是否遇到过左右两个孩子不双全的节点boolean leaf = false;Node l = null;Node r = null;queue.add(head);while (!queue.isEmpty()) {head = queue.poll();l = head.left;r = head.right;if (// 如果遇到了不双全的节点之后,又发现当前节点不是叶节点(leaf && (l != null || r != null)) || //如果某个节点有右孩子没有左孩子返回false;(l == null && r != null)) {return false;}if (l != null) {queue.add(l);}if (r != null) {queue.add(r);}if (l == null || r == null) {//如果有一个是null了,说明已经是最后一层了,//不能再有下一层了,根据这个条件上面判断是否还有下一层,有的话一定就不是leaf = true;}}return true;}public static boolean isCBT2(Node head) {if (head == null) {return true;}return process(head).isCBT;}

二 平衡二叉树

2.1 描述

它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树

2.2 分析

2.3 代码

public static boolean isBalanced2(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);}

三 搜索二叉树

3.1 描述

若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值;

一颗左子树节点上的值都小于右子树上的值,并且左子树和右子树也要是颗二叉树

3.2 分析

1、 可以通过中序遍历,看是不是升序就可以判断;经典的搜索二叉树是没有重复值的;

2、分析如下,要信息的方法

使用递归收集信息的时候左右节点最大值最小值都要

3.3 代码

public static boolean isBST2(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);}

四 二叉树的最大距离

4.1 描述

给定一棵二叉树的头节点head,任何两个节点之间都存在距离,

返回整棵二叉树的最大距离

4.2 分析

情况一 和x有关是左右树的最大距离加上本身

情况二 与 x 无关的分别是左右树的最大距离

与x有关的最大距离

最大距离的三种情况

从上面分析:我们需要向子树要的信息就是最大距离和高度

4.3代码

    public static int maxDistance2(Node head) {return process(head).maxDistance;}public static class Info {public int maxDistance;public int height;public Info(int m, int h) {maxDistance = m;height = h;}}public static Info process(Node x) {if (x == null) {return new Info(0, 0);}Info leftInfo = process(x.left);Info rightInfo = process(x.right);int height = Math.max(leftInfo.height, rightInfo.height) + 1;int p1 = leftInfo.maxDistance;int p2 = rightInfo.maxDistance;//与x有关int p3 = leftInfo.height + rightInfo.height + 1;int maxDistance = Math.max(Math.max(p1, p2), p3);return new Info(maxDistance, height);}

五 满二叉树的判断

5.1 描述

如果一棵二叉树的结点要么是叶子结点,要么它有两个子结点,这样的树就是满二叉树;

5.2 分析

5.3 代码

// 第一种方法// 收集整棵树的高度h,和节点数n// 只有满二叉树满足 : 2 ^ h - 1 == npublic static boolean isFull1(Node head) {if (head == null) {return true;}Info1 all = process1(head);return (1 << all.height) - 1 == all.nodes;}public static class Info1 {public int height;public int nodes;public Info1(int h, int n) {height = h;nodes = n;}}public static Info1 process1(Node head) {if (head == null) {return new Info1(0, 0);}Info1 leftInfo = process1(head.left);Info1 rightInfo = process1(head.right);int height = Math.max(leftInfo.height, rightInfo.height) + 1;int nodes = leftInfo.nodes + rightInfo.nodes + 1;return new Info1(height, nodes);}

六 一颗二叉树中,整体不是搜索二叉树,可能某个子树是搜索二叉树,子树(某个头节点下所有的子树都要),在整颗二叉树中,有哪一颗子树是搜索二叉树,在所有的搜索二叉子树中找出所有最大的那颗子树有多少个节点并返回

6.1 描述

一颗二叉树中,整体不是搜索二叉树,可能某个子树是搜索二叉树,子树(某个头节点下所有的子树都要),在整颗二叉树中,有那一刻子树是搜索二叉树,在所有的子树中找出所有最大的那颗子树有多少个节点并返回

6.2 分析

信息收集

信息合并 x左和x右就是maxBSTSubSize 左size和右size就是size

BST和size 两个可以合并,当maxBSTSubSize 和size相等的情况就是BST

6.3 代码

package class12;// 在线测试链接 : https://leetcode.com/problems/largest-bst-subtree
public class Code05_MaxSubBSTSize {// 提交时不要提交这个类public static class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int value) {val = value;}}// 提交如下的代码,可以直接通过public static int largestBSTSubtree(TreeNode head) {if (head == null) {return 0;}return process(head).maxBSTSubtreeSize;}public static class Info {public int maxBSTSubtreeSize;public int allSize;public int max;public int min;public Info(int m, int a, int ma, int mi) {maxBSTSubtreeSize = m;allSize = a;max = ma;min = mi;}}public static Info process(TreeNode x) {if (x == null) {return null;}Info leftInfo = process(x.left);Info rightInfo = process(x.right);int max = x.val;int min = x.val;int allSize = 1;if (leftInfo != null) {max = Math.max(leftInfo.max, max);min = Math.min(leftInfo.min, min);allSize += leftInfo.allSize;}if (rightInfo != null) {max = Math.max(rightInfo.max, max);min = Math.min(rightInfo.min, min);allSize += rightInfo.allSize;}//不以x为头的情况int p1 = -1;if (leftInfo != null) {p1 = leftInfo.maxBSTSubtreeSize;}int p2 = -1;if (rightInfo != null) {p2 = rightInfo.maxBSTSubtreeSize;}//以x为头的情况int p3 = -1;boolean leftBST = leftInfo == null ? true : (leftInfo.maxBSTSubtreeSize == leftInfo.allSize);boolean rightBST = rightInfo == null ? true : (rightInfo.maxBSTSubtreeSize == rightInfo.allSize);if (leftBST && rightBST) {boolean leftMaxLessX = leftInfo == null ? true : (leftInfo.max < x.val);boolean rightMinMoreX = rightInfo == null ? true : (x.val < rightInfo.min);if (leftMaxLessX && rightMinMoreX) {int leftSize = leftInfo == null ? 0 : leftInfo.allSize;int rightSize = rightInfo == null ? 0 : rightInfo.allSize;p3 = leftSize + rightSize + 1;}}return new Info(Math.max(p1, Math.max(p2, p3)), allSize, max, min);}}

七 本节总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/762254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库 - 索引

一. 索引的相关知识 1. 索引的概念 是一个排序的列表&#xff0c;存储着索引值和这个值所对应的物理地址&#xff08;类似于C语言的链表通过指针指向数据记录的内存地址&#xff09;使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找到该行数据对应…

How to install PyAlink on Ubuntu 22.04

How to install PyAlink on Ubuntu 22.04 环境准备准备conda python环境创建项目虚拟环境激活虚拟环境 安装脚本细节 环境准备 准备conda python环境 关于如何安装conda环境&#xff0c;可以参阅我此前整理的如下文章&#xff1a; How to install Miniconda on ubuntu 22.04…

一句话讲清脏读 、丢失修改、不可重复读、幻读

脏读 : 一个事务读取到了另一个事务回滚之前的数据. 丢失修改 : 两个事务同时访问一个数据时,一个事务在修改的时候不能获取到另一个事务先前已经修改过的内容. 不可重复读:一个事务A内在第二次查询的时候,查到了另一个事务B在A事务第一次查询之后修改的数据. 幻读&#xff…

【Godot 3.5控件】用TextureProgress制作血条

说明 本文写自2022年11月13日-14日&#xff0c;内容基于Godot3.5。后续可能会进行向4.2版本的转化。 概述 之前基于ProgressBar创建过血条组件。它主要是基于修改StyleBoxFlat&#xff0c;好处是它几乎可以算是矢量的&#xff0c;体积小&#xff0c;所有东西都是样式信息&am…

基于Arduino IDE 野火ESP8266模块WIiFi开发

一、函数介绍 头文件 #include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h>ESP8266WiFi.h库主要用于连接单个WiFi网络。如果需要连接到多个WiFi网络&#xff0c;例如在需要切换不同网络或者备用网络时&#xff0c;可以使用ESP8266WiFiMulti.h头文件&#xff…

mysql的基本知识点-排序和分组

分组&#xff08;GROUP BY&#xff09; GROUP BY 语句用于结合聚合函数&#xff0c;根据一个或多个列对结果集进行分组。例如&#xff0c;假设你有一个包含销售数据的表&#xff0c;并且你想按产品类别计算总销售额。你可以使用 GROUP BY 和 SUM() 函数来实现这一点。 SELECT…

策略模式业务实战

一、策略模式实现任务分发 1.新建策略接口 package com.ehe.elder.strategy;public interface ElderJobOrderStrategy {void notifyMethod(String outTradeNo); }2.新建策略实现类 Slf4j Component public class ElderJobOrderGranter implements ElderJobOrderStrategy {pu…

【Leetcode】top 100 多维动态规划

62 不同路径 一个机器人位于一个 m x n 网格的左上角&#xff0c;机器人每次只能向下或者向右移动一步&#xff0c;机器人试图达到网格的右下角&#xff0c;问总共有多少条不同的路径&#xff1f; 分析&#xff1a;dp[i][j] 代表走到 (i, j) 的路径总和数 递推规律&#xff1a…

java.lang.String final

关于String不可变的问题&#xff1a;从毕业面试到现在&#xff0c;一个群里讨论的东西&#xff0c;反正码农面试啥都有&#xff0c;这也是我不咋喜欢面试代码&#xff0c;因为对于我而言&#xff0c;我并不喜欢这些面试。知道或不知道基本没啥含氧量&#xff0c;就是看看源代码…

构造函数调用规则

默认情况下&#xff0c;c编译器至少给一个类添加3个函数 1&#xff0e;默认构造函数(无参&#xff0c;函数体为空) 2&#xff0e;默认析构函数(无参&#xff0c;函数体为空) 3&#xff0e;默认拷贝构造函数&#xff0c;对属性进行值拷贝(“”号赋值) 构造函数调用规则如下&…

大数据,或称巨量资料

大数据&#xff0c;或称巨量资料&#xff0c;指的是在传统数据处理应用软件不足以处理的大或复杂的数据集。大数据也可以定义为来自各种来源的大量非结构化或结构化数据。从学术角度而言&#xff0c;大数据的出现促成广泛主题的新颖研究&#xff0c;这也导致各种大数据统计方法…

【ZooKeeper】2、安装

本文基于 Apache ZooKeeper Release 3.7.0 版本书写 作于 2022年3月6日 14:22:11 转载请声明 下载zookeeper安装包 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz解压 tar -zxvf apache-zookeeper-3.7.0-b…

【Python 48小时速成 8】函数

在 Python 中&#xff0c;函数是一段可重复调用的代码块&#xff0c;用于执行特定任务。函数可以接受参数并返回值。下面是函数的基本结构以及示例代码&#xff1a; # 示例代码一&#xff1a;定义一个简单的函数 def greet():print("Hello, World!") # 函数体内的代…

界面组态软件---昆仑通态

昆仑通态参考资料 HMI人机界面 昆仑通态专题&#xff08;三&#xff09;&#xff1a;MCGS嵌入版组态软件的报警 HMI触摸屏编程

数据结构从入门到精通——二叉树的实现

二叉树的实现 前言一、二叉树链式结构的实现1.1前置说明1.2二叉树的手动创建 二、二叉树的遍历2.1 前序、中序以及后序遍历二叉树前序遍历二叉树中序遍历二叉树后序遍历2.2 层序遍历练习 三、二叉树的具体代码实现二叉树的节点个数二叉树叶子节点个数二叉树第k层节点个数二叉树…

记录 Selenium 常用功能和API

目录 WebDriver 类 常用 APIWebElement 类 常用 API元素等待机制sleep()方法隐式等待显式等待重写 apply() 方法ExpectedConditions类中常用方法页面加载超时设置 浏览器操作控制浏览器操作Window 类Navigation 类 浏览器窗口的切换滚动条操作弹出框处理&#xff08;alert、con…

个人网站制作 Part 14 添加网站分析工具 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加网站分析工具&#x1f528;使用Google Analytics&#x1f527;步骤 1: 注册Google Analytics账户&#x1f527;步骤 2: 获取跟踪代码 &#x1f528;使用Vue.js&#…

[AIGC] Apache HTTP服务器:历史与使用

Apache HTTP服务器&#xff1a;历史与使用 Apache HTTP服务器&#xff0c;通常我们简称为Apache&#xff0c;是一款流行且强大的开源Web服务器软件。它伴随互联网的快速成长&#xff0c;并承载了许多网站服务的运行和访问。通过最新的科技和广阔的功能&#xff0c;Apache服务器…

实体框架EF(Entity Framework)简介

实体框架EF&#xff08;Entity Framework&#xff09;简介 文章目录 实体框架EF&#xff08;Entity Framework&#xff09;简介一、概述二、O/R Mapping是什么采用O/R Mapping带来哪些好处 三、Entity Framework架构3.1 下图展示了Entity Framework的整体架构3.2 Entity Framew…

MyBatis:XML操作

&#x1f451;专栏内容&#xff1a;MyBatis⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、MyBatis XML方式1、配置数据库2、指明XML路径3、写持久层代码 二、基础操作1、新增2、删除3、更新4、查找Ⅰ、开启驼峰命…