【java数据结构】模拟二叉树的链式结构之孩子表示法,掌握背后的实现逻辑

📢编程环境:idea
📢树结构,以及叶子,结点,度等一些名词是什么意思,本篇不再赘述。

【java数据结构】模拟二叉树的链式结构之孩子表示法,掌握背后的实现逻辑

  • 1. 认识二叉树
    • 1.1 二叉树的结构
    • 1.2 两种特殊的二叉树
      • 1.21 满二叉树
      • 1.22 完全二叉树
    • 1.3 二叉树的性质
  • 2. java语言,模拟实现二叉树的链式结构之孩子表示法(以存char类型元素为例)
    • 2.1 二叉树的遍历
      • 2.11 前序遍历
      • 2.12 中序遍历
      • 2.13 后序遍历
    • 2.2 创建一颗二叉树

1. 认识二叉树

二叉树是重要的数据结构之一,之所以叫二叉树,是因为用它组织的数据逻辑上就像一颗自然界中倒挂的二叉树一样。即树的根朝上,所有树枝只要遇到分叉,当下最多分两个叉,树枝朝下。
在这里插入图片描述

1.1 二叉树的结构

先来理解二叉树的逻辑结构

二叉树是一种逻辑上非线性的数据结构。一颗二叉树是一个有限个元素的集合。该集合或者为空,或者由一个根元素加上两颗别称为左子树和右子树的二叉树组成。这也是二叉树的递归性,一颗二叉树是由一个套一个的子二叉树构成的。还要注意的是,左右子树的次序不能颠倒。

在这里插入图片描述

在这里插入图片描述

对于二叉树中的每个元素,它都有唯一一个前驱(除头元素没有前驱)和不超过两个后继(不超过两个后继的意思是:后继的个数可以是0,1,2)
在这里插入图片描述
即对于任意的二叉树都是由以下几种情况复合而成的:在这里插入图片描述


再来理解二叉树的(物理)存储结构

二叉树的存储结构分为顺序存储和类似于链表的链式存储。本篇以实现二叉树的链式存储结构为主。

先来回忆一下链表的链式存储:用链表存储一组元素,其中每个元素都存储在一个结点中。单链表的每个结点中存储元素的同时,还要存储下一个元素的地址,双向链表的每个结点中存储元素的同时,还要存储上一个元素的结点地址和下一个元素的结点地址。

在这里插入图片描述

而二叉树的链式存储,也是把每个元素都存储在一个结点中,但是不同于链表为了保持逻辑上的线性结构,结点中存元素的同时还要存储前一个和后一个元素的节点地址。而二叉树在逻辑上是非线性的树结构,为了保持该结构,二叉树的每个节点中存储元素的同时,还要存储它的前驱结点地址和后继结点地址。

二叉树的每个结点中如果同时存元素,前驱结点地址,后继结点地址,统一又把这种链式存储方式叫做孩子表示法。例如用孩子表示法存储下面这颗二叉树:
在这里插入图片描述

二叉树的每个结点中如果存元素,和后继结点地址,统一又把这种链式存储方式叫做孩子双亲表示法。
在这里插入图片描述其中,自上而下看一颗二叉树,根元素所在的结点又叫做根结点。
在这里插入图片描述

本篇要用java语言模拟实现孩子表示法存储二叉树,以及一些常用基本操作孩子双亲表示法存储二叉树会在后续总结AVL树,红黑树的博客中重点介绍,二叉树的顺序存储会在后续总结 的博客中重点介绍。

1.2 两种特殊的二叉树

1.21 满二叉树

一颗二叉树,如果每层的结点数都达到最大值,即每个元素都有两个后继,则这颗二叉树就是满二叉树。

在这里插入图片描述

其中,假设满二叉树的层数是k,则该满二叉树的节点总数是(2^k)-1即2的k次方-1

在这里插入图片描述

1.22 完全二叉树

完全二叉树是由满二叉树引出来的。

对于深度为k的,有n个结点的二叉树,当且仅当它的每个结点都与深度为k的满二叉树中编号从0至n-1的节点一一对应时,该二叉树才能称之为完全二叉树。(其中满二叉树中结点按从左到右,从上到下的顺序进行编号,此处假设根节点从0号开始)。

在这里插入图片描述

满二叉树是特殊的完全二叉树。

1.3 二叉树的性质

  1. 若规定只有根节点的二叉树深度为1,则深度为k的二叉树最多有2k-1个结点(满二叉树)。(k>=0)

在这里插入图片描述

  1. 若规定根节点是第一层,则一颗非空二叉树的第 i 层上最多有 2(i-1) 个结点。(i>0)

在这里插入图片描述

  1. 对任何一颗二叉树,如果其叶结点个数为n0,度为2的结点个数为n2,则有n0=n2+1

    • 其实就是,在任意一颗二叉树中,叶子结点个数永远比度为2的结点个数多一个
      在这里插入图片描述

      • 在二叉树中,若一个结点没有后继,则该结点就是叶子结点
      • 就是一个结点有几个后继,若一个结点有一个后继,该结点度为1;若一个结点有两个后继,该结点度为2。
    • 推论:

      • 在任意一颗二叉树当中,假设,该二叉树的叶子结点个数为n0,度为1的结点个数为n1,度为2的结点个数为n2,设这颗二叉树的总结点个数为N。所以:N=n0+n1+n2
      • 又因为:一颗有N个结点的树有N-1条边。叶子结点向下不会产生边;度为1的结点向下会产生一条边,即n1个结点产生边的个数是n1。度为2的结点向下会产生两条边,即n2个结点产生边的个数是2*n2。所以:N-1=n1+2 * n2,即N=n1+2*n2 +1
      • 两个式子联立最后推出:n0=n2+1
  2. 具有n个结点的完全二叉树,其深度k为log2(n+1) 向上取整。

在这里插入图片描述

  1. 对于有n个结点的完全二叉树,假设按照从左到右,从上到下的顺序对所有结点从0开始编号,根节点为0号,最后一个结点时 n-1 号。在这里插入图片描述
    • 已知 一个结点是 i 号,则它的双亲节点(前驱结点)的编号是 (i-1)/2 。根结点是0号,没有双亲结点。
    • 已知 一个结点是 i 号,则它的左孩子结点的编号是 2i+1(2i+1<n)。若2i+1>n,该左孩子不存在,即 i 号结点没有左孩子。
    • 已知 一个结点是 i 号,则它的右孩子结点的编号是 2i+2(2i+2<n)。若2i+2>n,该右孩子不存在,即 i 号结点没有右孩子。

在这里插入图片描述


二叉树的结构和性质我们都要非常熟悉,才能在此基础上更好的解决有关二叉树的相关题目,以及在实际场景中应用二叉树。

2. java语言,模拟实现二叉树的链式结构之孩子表示法(以存char类型元素为例)

用java语言模拟实现一个二叉树,java是面向对象语言,所以首先要创建一个类来表示二叉树,这个类里面有一个静态内部类,一个成员变量,若干个成员方法。静态内部类是为了描述结点,结点中要存储元素,左孩子地址,右孩子地址(孩子表示法);成员变量是二叉树的根结点;通过成员方法对二叉树进行遍历,以及增删改查操作。

public class MyBinaryTree {
    public static class Node{
        int val;//元素域
        Node left;//左孩子的引用,常常代表左孩子为根的整颗左子树
        Node right;//右孩子的引用,常常代表右孩子为根的整颗右子树
        Node(int val){
            this.val = val;
        }
        private Node root;//二叉树的根节点
        
        //仅博客需要,先穷举法创建一个二叉树,方便演示二叉树的遍历,实际场景中不要用这种方法创建二叉树
        public void createMyBinaryTree(){

        }
        //前序遍历
        void preOrder(Node root){
            ;
        }
        //中序遍历
        void inOrder(Node root){
            ;
        }
        //后序遍历
        void postOrder(Node root){
            ;
        }
        //二叉树的构建(结点中存char类型的元素)
        Node create(String str){
            return null;
        }

        // 获取树中节点的个数
        int size(Node root){
            return -1;
        }

        // 获取叶子节点的个数
        int getLeafNodeCount(Node root){
            return -1;
        }

        // 子问题思路-求叶子结点个数
        int getLeafNodeCount1(Node root){
            return -1;
        }

        // 获取第K层节点的个数
        int getKLevelNodeCount(Node root,int k){
            return -1;
        }

        // 获取二叉树的高度
        int getHeight(Node root){
            return -1;
        }

        // 检测值为value的元素是否存在
        Nodend(Node root, int val){
            return null;
        }

        //层序遍历
        void levelOrder(Node root){

        }

        // 判断一棵树是不是完全二叉树
        boolean isCompleteTree(Node root){
            return true;
        }
    }
}

2.1 二叉树的遍历

2.11 前序遍历

2.12 中序遍历

2.13 后序遍历

2.2 创建一颗二叉树

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

社区店引流推广秘籍:让你的店铺人气爆棚

作为一名开鲜奶吧5年的创业者&#xff0c;我深知在如今竞争激烈的市场环境下&#xff0c;开一家成功的社区店并非易事。 从选址到装修&#xff0c;从商品选择到服务提升&#xff0c;每一个环节都至关重要。但其中&#xff0c;引流推广无疑是让店铺人气爆棚、脱颖而出的关键所在…

力扣hot100题解(python版33-35题)

33、排序链表 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4]示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5]示例 3&a…

紫光展锐T618_4G安卓核心板方案定制

紫光展锐T618核心板是一款采用纯国产化方案的高性能产品&#xff0c;搭载了开放的智能Android操作系统&#xff0c;并集成了4G网络&#xff0c;支持2.5G5G双频WIFI、蓝牙近距离无线传输技术以及GNSS无线定位技术。 展锐T618核心板应用旗舰级 DynamlQ架构 12nm 制程工艺&#x…

从0开始的ios自动化测试

最近由于工作内容调整&#xff0c;需要开始弄ios自动化了。网上信息有点杂乱&#xff0c;这边我就按我的实际情况&#xff0c;顺便记录下来&#xff0c;看是否能帮到有需要的人。 环境准备 安装tidevice pip3 install -U “tidevice[openssl]”它的作用是&#xff0c;帮你绕…

LeetCode 刷题 [C++] 第108题.将有序数组转换为二叉搜索树

题目描述 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 题目分析 由于二叉搜索树的中序遍历是升序的&…

STM32(16)使用串口向电脑发送数据

发送字节 发送数组 发送字符和字符串 字符&#xff1a; 字符串&#xff1a; 字符串在电脑中以字符数组的形式存储

Android APK包反编译为java文件教程

方法 流程&#xff1a; test.apk -> smali文件 -> dex文件 -> jar文件 ->java 文件 将APK包解压为 smail文件 下载 apktool工具 apktool.jar 将 test.apk 和 apktool.jar放同一目录下&#xff0c;并执行以下命令 java -jar apktool.jar d -f xxx.apk -o xxx(解…

Linux-信号3_sigaction、volatile与SIGCHLD

文章目录 前言一、sigaction__sighandler_t sa_handler;__sigset_t sa_mask; 二、volatile关键字三、SIGCHLD方法一方法二 前言 本章内容主要对之前的内容做一些补充。 一、sigaction #include <signal.h> int sigaction(int signum, const struct sigaction *act,struc…

“比特币暴拉冲破6.5万美元”!超罕见指标揭示牛市信号,18万美元目标能否实现?

比特币&#xff08;BTC&#xff09;周末持续在6.2万美元反复震荡之后&#xff0c;今&#xff08;4&#xff09;晨再次强势拉涨&#xff0c;早上8&#xff1a;45左右最高触及64268美元&#xff0c;随后插针盘整&#xff0c;下午5点30分左右突破65500美元&#xff0c;再创今年新高…

tomcat下载安装配置教程

tomcat下载安装配置教程 我是使用tomcat下载安装及配置教程_tomcat安装-CSDN博客 此贴来进行安装配置&#xff0c;原文21年已经有些许不同。 下载tomcat 官网&#xff1a;http://tomcat.apache.org/ 我们老师让安装8.5以上&#xff0c;所以我直接选择版本9 点击9页面之后…

YOLOv5-Openvino和ONNXRuntime推理【CPU】

1 环境&#xff1a; CPU&#xff1a;i5-12500 Python&#xff1a;3.8.18 2 安装Openvino和ONNXRuntime 2.1 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包&#xff0c;主要用于对深度推理做优化。 Openvino内部集成了Opencv、Tens…

[Redis]——RedisTemplate的两种序列化方式

目录 1. RedisTemplate 2. StringRedisTemplate 方案一&#xff1a; 自定义RedisTemplate修改RedisTemplate的序列化器写入数据时自动序列化 方案二&#xff1a; 使用StringRedisTemplate手动序列化手动反序列化 1. RedisTemplate 编写的java代码 Testvoid contextLoads2…

Redis 淘汰策略、持久化、高可用

淘汰策略 只有 redis 内存空间已满并且往里面写新数据&#xff0c;才会触发淘汰策略。通过 expire / / /pexpire 让 key-value 过期&#xff0c;从而让 redis 清除这个 key-value。value 的数据结构typedef struct redisObject {unsigned tpye:4;unsigned encoding:4;// 判断哪…

10个软件测试的吐槽点!

问题一&#xff1a;测试时间评估 这是一个工作日常经常需要回复的问题&#xff0c;理论上&#xff0c;测试这边要做出较科学合理的回复&#xff0c;那就要将【需求变更】、【开发进度延误】、【bug 修复不稳定】、【复杂业务流程】、【测试环境不稳定】、【上下游服务依赖】、…

LaTeX文档中文显示错误解决办法

LaTeX文档中文显示错误解决办法 如果在LaTeX文档中遇到中文显示错误&#xff0c;通常是因为文档没有正确配置以支持中文。解决这个问题的一个常见方法是使用XeLaTeX引擎编译文档&#xff0c;它天然支持UTF-8编码&#xff0c;可以很好地处理中文。同时&#xff0c;使用ctex宏包…

Vue3中使用ffmpeg.wasm进行转码

一、安装方法 1.1 使用yarn进行安装 yarn add ffmpeg/ffmpeg ffmpeg/core1.2 安装版本 注意安装版本需在0.12.0以上版本才可以使用下面代码&#xff08;目前更新到0.12.10&#xff09;&#xff0c;之前的版本代码使用方法有所不同&#xff08;0.12.10之后的版本也可能会有变动…

链表相加(二)

题目 题目链接 链表相加(二)_牛客题霸_牛客网 题目描述 代码实现 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param head1 ListNode类 * param head2 ListNode类 * return ListNode…

4G/5G执法记录仪、智能安全帽走国标GB28181接入海康、宇视等大平台,也可走平台与平台对接,以下级平台级联到上级大平台

AIoT万物智联&#xff0c;智能安全帽生产厂家&#xff0c;执法记录仪生产厂家&#xff0c;智能安全帽、智能头盔、头盔记录仪、执法记录仪、智能视频分析/边缘计算AI盒子、车载DVR/NVR、布控球、智能眼镜、智能手电、无人机4G补传系统等统一接入大型融合通信可视指挥调度平台VM…

【算法分析与设计】被围绕的区域

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O &#xff0c;找到所有被 X 围绕的区域&#xff0c;并将这些区域里所有…

告别手动填写邀请码,这款App数据统计工具帮你轻松实现

在移动互联网时代&#xff0c;App的推广和运营已成为各大企业的必修课。然而&#xff0c;面对错综复杂的推广渠道和浩如烟海的数据&#xff0c;如何精准地追踪用户来源、优化推广策略&#xff0c;一直是困扰着运营者的难题。今天&#xff0c;我们就来聊聊一款能够帮助你轻松解决…