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

news2024/9/22 15:26:04

📢编程环境: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 创建一颗二叉树

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

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

相关文章

桂院校园导航 | 云上高校导航 云开发项目 二次开发教程 2.0

Gitee代码仓库&#xff1a;桂院校园导航小程序 GitHub代码仓库&#xff1a;GLU-Campus-Guide 演示视频 【校园导航小程序】2.0版本 静态/云开发项目 演示 云开发项目 2.0版本 升级日志 序号 板块 详情 1 首页 重做了首页&#xff0c;界面更加高效和美观 2 校园页 新增…

Python判断结构20个实例

基本理论基础 Python中的选择判断结构是一种编程中常用的控制结构&#xff0c;它用于根据条件的真假决定程序的执行路径。选择判断结构有多种类型&#xff0c;包括if语句、if-else语句、if-elif-else语句以及嵌套的选择结构。 首先&#xff0c;我们来介绍最常见的if语句。if语…

浅谈WPF之Binding数据校验和类型转换

在WPF开发中&#xff0c;Binding实现了数据在Source和Target之间的传递和流通&#xff0c;就像现实生活中的一条条道路&#xff0c;建立起了城镇与城镇之间的衔接&#xff0c;而数据校验和类型转换&#xff0c;就像高速公路之间的收费站和安检站。那在WPF开发中&#xff0c;如何…

引入本地图片报错:require is not defined

文章目录 问题分析1. 原始写法2. 最初的解决方案3. 尝试使用 require 引入4. 封装方法进行解析引入图片 问题 Vue3 Vite 使用本地图片报错&#xff1a;require is not defined 分析 1. 原始写法 刚开始我是这样写的&#xff0c;数据是这样定义的&#xff0c;但是数据没出…

Vue.js+SpringBoot开发高校实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

2024年R2移动式压力容器充装证考试题库及R2移动式压力容器充装试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年R2移动式压力容器充装证考试题库及R2移动式压力容器充装试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上…

快速幂(求解原理+例题)

目录 反复平方法&#xff08;快速幂&#xff09;&#xff1a; 代码&#xff1a; 例题&#xff1a;快速幂求逆元 作用&#xff1a; 快速求出 的结果。 时间复杂度&#xff1a; O(logk) 如果使用一般做法&#xff0c;从1循环到k&#xff0c;时间复杂度是O(k) 反复平方法&am…

倒计时35天

小红的子序列权值和 (nowcoder.com) #include<bits/stdc.h> using namespace std; #define int long long const int N2e56; const int inf0x3f3f3f3f; const double piacos(-1.0); const int mod1e97; int c[1100][1100]; int a[1100],b[5]; void solve() {int n;cin>…

照片变年轻怎么操作?收好这几个方法

照片变年轻怎么操作&#xff1f;在这个数字时代&#xff0c;我们手中的智能手机和相机成为了记录生活的重要工具。然而&#xff0c;随着时间的推移&#xff0c;照片中的人物往往会因为岁月的痕迹而显得苍老。那么&#xff0c;有没有一种方法可以让这些珍贵的回忆重新焕发青春呢…

[DevOps云实践] 跨AWS账户及Region调用Lambda

[DevOps云实践] 跨AWS账户及Region调用Lambda 本文將幫大家理清一下幾個問題: 如何跨不同AWS賬戶,不同Region來調用Lambda? 不同Lambda之間如何互相調用?有時我們希望我們的Lambda脚本能夠運行在多個AWS賬戶中的不同Region下,但是,我們還不希望每個下面都去建立一個運行…

从0开始学习NEON(1)

1、前言 在上个博客中对NEON有了基础的了解&#xff0c;本文将针对一个图像下采样的例子对NEON进行学习。 学习链接:CPU优化技术 - NEON 开发进阶 上文链接:https://blog.csdn.net/weixin_42108183/article/details/136412104 2、第一个例子 现在有一张图片&#xff0c;需…

【CSP试题回顾】201403-2-窗口

CSP-201403-2-窗口 解题思路 窗口存储结构&#xff1a;首先&#xff0c;使用一个结构体MyWindow来存储每个窗口的信息&#xff0c;包括窗口的序号&#xff08;index&#xff09;和矩形区域的四个顶点坐标&#xff08;x1, y1, x2, y2&#xff09;。所有窗口的信息存储在一个向量…

17 easy 290. 单词规律

//给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 // // 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 // // // // 示例1: // // //输入: patte…

一篇文章教会你如何在IOS真机上完美运行React Native

一篇文章教会你如何在IOS真机上完美运行React Native 项目初始化项目配置可能遇到的问题没有账号也没有Team设备上没有打开开发者模式&#xff0c;也没有信任开发者证书 无线调试 项目初始化 在终端使用**npx react-native init ProjectName**初始化React Native项目。 进入项…

selenuim【1】$x(‘xpath’)、WebDriverWait()、try/assert

文章目录 1、执行driver webdriver.Chrome()后很久才打开浏览器2、浏览器多元素定位 $x(‘xpath语法’)3、打开浏览器driver.get("网址")执行了很久才开始定位元素&#xff1a;等待&#xff08;1&#xff09;driver.set_page_load_timeout(t)&#xff08;2&#xff…

Live Home 3D Pro:您的私人家居设计师,让家更有温度

Live Home 3D Pro是一款功能强大的家居设计软件&#xff0c;它凭借直观的用户界面和丰富的设计工具&#xff0c;为用户提供了一个全新的家居设计体验。无论您是专业设计师还是普通用户&#xff0c;Live Home 3D Pro都能帮助您轻松实现家居设计的梦想。 Live Home 3D Pro mac版…

枚举与尺取法(蓝桥杯 c++ 模板 题目 代码 注解)

目录 组合型枚举&#xff08;排列组合模板&#xff08;&#xff09;&#xff09;: 排列型枚举&#xff08;全排列&#xff09;模板&#xff1a; 题目一&#xff08;公平抽签 排列组合&#xff09;&#xff1a; ​编辑 代码&#xff1a; 题目二&#xff08;座次问题 全排…

财报解读:基本盘稳定后,联想如何进一步抢占AI时代?

从2021年下半年开始&#xff0c;受诸多因素影响&#xff0c;消费电子行业始终处在承压状态&#xff0c;“不景气”这一关键词屡次被市场提及。 但寒气没有持续&#xff0c;可以看到&#xff0c;消费电子行业正在逐渐回暖。国金证券在今年1月的研报中就指出&#xff0c;从多方面…

学习python时一些笔记

1、winr 命令提示符的快捷键 输入cmd进入终端 2、在终端运行桌面上的python文件 cd desktop(桌面) cd是进入该文件夹的意思。 cd .. 回到上一级 运行python时一定要找到文件的所在地 输入python进入&#xff0c;exit()退出%s字符串占位符%d数字占位符%f浮点数占位符input输…

手把手教你零成本获客的教育培训小程序

随着科技的发展&#xff0c;数字化教育成为现代教育的趋势。为了满足教育培训机构的需求&#xff0c;许多教育培训小程序搭建平台应运而生。今天&#xff0c;我们将为大家介绍一种简单快捷的搭建教育培训小程序的方法。 首先&#xff0c;登录【乔拓云】制作平台&#xff0c;进入…