JAVA 二叉树超详解(1)

news2024/10/6 2:22:30

树形结构

概念

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它根朝上,而叶朝下的,具有以下的特点:

1.有一个特殊的结点,称为根结点,根节点没有前驱节点

2.除根节点外,其余节点被分成M(M>0)个互不相交的集合T1,T2.....Tm,其中每一个集合Ti又是一棵与树类似的子树。每棵子树的根节点有且只有一个前驱,可以有0或者多个后继(一棵树是由若干不相交的子树构成)

3.树是递归定义的

注意:树形结构中,子树之间不能有交集,否则就不是树形结构 

判断树与非树的重要考察点:

1.子树是不想交的

2.除了跟节点外,每个节点有且仅有一个父节点

3.一棵N个节点的树有N-1条边

关键词

以下图为例:

节点的度:一个结点含有子树的个数称为结点的度; 如上:A的度为6

树的度:一棵树中,所有结点的度的最大值称为树的度;如上:树的度为6

叶子节点或终端节点:度为零的结点称为叶节点;如上:B,C,H,I,P等为叶子节点

孩子结点或子节点:一个节点含有的子树的根节点称为该结点的子节点;如:B是A的子节点

根结点:一棵树中,没有双亲结点的结点,如上:A为根结点

树的高度或深度:树中结点的最大层次;如上:树的高度为4.

树的表示形式

树结构相对于线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多表示方式,如:双亲表示法,孩子表示法,孩子双亲表示法等等。我们就来简单了解一下最常用的孩子兄弟表示法(通过一个结点的一个孩子去找它其它的子节点(这个孩子的兄弟))。

class Node {
    int value;    //树中存储的数据
    Node firstChild;    //第一个孩子的引用
    Node nextBrother;    //下一个兄弟的引用
}

简图:

树的应用

文件系统管理(目录和文件)

 

二叉树

概念

一棵二叉树是结点的一个有限集合,该集合:

 1.或者为空

2.或者是由一个根节点加上两棵分别被称为左子树和右子树的二叉树组成。

 

其中:A为根节点,B及其以下的部分为根结点的左子树,C及其以下的部分为根节点的右子树。

从上图可以看出:

1.二叉树不存在度大于2的结点

2.二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树 

注意:对于任意的二叉树都是由以下几种情况复合而成的:

 

两种特殊的二叉树

1.满二叉树:一棵二叉树,如果每层的节点数都达到最大值,则这棵二叉树就是满二叉树。也就是说,如果一棵二叉树的层数为k,且节点总数2^K-1,那么他就是满二叉树。

2.完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引来的。对于深度为K 的,有N个结点的二叉树,满二叉树中编号从0至N-1的结点--对应时称之为完全二叉树,也就是从左到右,从上到下依次存放结点的二叉树(其中一个为空就不是)要注意满二叉树是一种特殊的完全二叉树

二叉树的性质(重要)

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

2.若规定只有根节点的二叉树深度为1,则深度为K的二叉树所含最多节点数为(就是满二叉树):2^K - 1(K>=0) 

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

 

推理如下:

4.具有N个结点的完全二叉树的深度为log(n+1)向上取整,底数为2(可以借助第二点反推)

5.对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,那么对序号为i的节点有

(1).若i>0,双亲序号:(i-1)/2;i = 0,i为根结点编号,无双亲结点

(2).若2i+1<n,左孩子序号:2i+1,否则无左孩子

(3).若2i+2<n,右孩子序号:2i+2,否则无右孩子

二叉树的存储

二叉树的存储结构分为:顺序存储和类似于链表的链式存储。

二叉树的链式存储是通过一个一个的结点引用起来的,常见的引用方式有二叉和三叉表示方式:

//孩子表示法
class Node {
    int val;    //数据域
    Node left;    //左孩子的引用,常常代表左孩子为根的整棵左子树
    Node right;    //右孩子的引用,常常代表右孩子为根的整棵左子树
}

//孩子双亲表示法
class Node{
    int val;    //数据域
    Node left;    //左孩子的引用,常常代表左孩子为根的整棵左子树
    Node right;    //右孩子的引用,常常代表右孩子为根的整棵左子树
    Node parent;    //当前节点的根结点
}

 

二叉树的基本操作

说明

在学习二叉树基本操作之前,需要创建一棵二叉树,然后才能学习其相关的基本操作。此处先创建一个简单的二叉树: 

public class BinaryTree {
    public static class BTNode {
        BTNode left;
        BTNode right;
        int value;
        
        BTNode(int value) {
            this.value = value;
        }
    }
    
    private BTNode root;
    
    public void createBinaryTree() {
        BTNode node1 = new BTNode(1);
        BTNode node2 = new BTNode(2);
        BTNode node3 = new BTNode(3);
        BTNode node4 = new BTNode(4);
        BTNode node5 = new BTNode(5);
        BTNode node6 = new BTNode(6);
        
        root = node1;
        node1.left = node2;
        node2.left = node3;
        node1.right = node4;
        node4.left = node5;
        node5.right = node6;
    }
}

注意:上述代码并不是创建二叉树的真正方式,真正创建二叉树的方式后续再讲。 

 二叉树的遍历

1.前中后序遍历

学习二叉树结构,最简单的方式就是遍历。所谓遍历就是指沿着某条路线,依次对树中每个结点均做一次且仅做一次访问。访问节点所做的操作依赖于具体的应用问题(比如:打印节点内容,节点内容+1)。遍历是二叉树上的最重要的操作之一,是二叉树上进行其它运算的基础。

 

在遍历二叉树时,如果没有某种规定,每一个人都煮自家的粥,按照各个不同的遍历方法,难免会有些混乱,如果按照某种规则进行约定,则每一个人遍历二叉树的方法是相同的。 

如果规定N为根结点,L代表根结点的左子树,R代表根结点的右子树,则根据结点的先后次序有以下的遍历方式:

1.NLR:前序遍历--先访问根节点--根的左子树--根的右子树(先遇到哪个就先访问哪个)

2.LNR:中序遍历--先访问根的左子树--根节点--根的右子树(一直向左走,直到左边为空,然后回溯访问结点)

3.LRN:后序遍历--先访问根的左子树--根的右子树--根结点(将一个结点的左右子树走完,再访问结点)

代码(主要利用递归的方式):

//前序遍历
void preOrder(Noot root) {
    //访问到并进行对节点内容打印的操作
    System.out.print(root.value);
    //先对左子树进行递归
    preOrder(root.left);
    //后对右子树进行递归
    preOrder(root.right);
}

//中序遍历
void inOrder(Noot root) {
     //先对左子树进行递归
    preOrder(root.left);
    //访问到并进行对节点内容打印的操作
    System.out.print(root.value);
    //后对右子树进行递归
    preOrder(root.right);
}

//后序遍历
void postOrder(Noot root) {
     //先对左子树进行递归
    preOrder(root.left);
    //后对右子树进行递归
    preOrder(root.right);
    //访问到并进行对节点内容打印的操作
    System.out.print(root.value);
}

参考示例:

1.前序遍历:123456

2.中序遍历:321546

3.后序遍历:325641 

2.层序遍历

定义:除了先序遍历,中序遍历,后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在的层数为1,层序遍历就是从所在的二叉树的根节点出发,进行从上到下,从左到右的遍历。

 

 

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

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

相关文章

【C语言】错题本(4)

一. 题目及选项: 答案解析: 知识点: 字符型在内存中的数据存储 char类型数据在内存中的图示: unsigned char类型数据在内存中的图示: 二. 题目及选项: 答案解析: A: B: C: D: 三. 题目及选项: 答案解析: 数据在计算机中是先转换成补码,再进行运算的!

论文笔记:ViTGAN: Training GANs with Vision Transformers

2021 1 intro 论文研究的问题是&#xff1a;ViT是否可以在不使用卷积或池化的情况下完成图像生成任务 即不用CNN&#xff0c;而使用ViT来完成图像生成任务将ViT架构集成到GAN中&#xff0c;发现现有的GAN正则化方法与self-attention机制的交互很差&#xff0c;导致训练过程中…

windows上配置vscode C/C++代码跳转

windows上配置vscode C/C代码跳转 安装插件 C/C 官方的 C/C 插件&#xff0c;必备的插件&#xff0c;是代码跳转、自动补全、代码大纲显示等功能的基础。 Gtags C/C GNU Global GNU Global除了安装该插件之外&#xff0c;还需要在本地下载安装GNU Global工具。多看下插件…

智算创新,美格智能助力智慧支付加速发展

9月21日&#xff0c;以“智算引领创新未来”为主题的紫光展锐2023泛物联网终端生态论坛在深圳举行。作为紫光展锐重要战略合作伙伴&#xff0c;美格智能标准模组产品线总经理郭强华、高级产品总监刘伟鹏受邀出席论坛。美格智能基于紫光展锐5G、4G、智能SoC、Cat.1 bis等芯片平台…

系统集成|第十二章(笔记)

目录 第十二章 沟通管理12.1 沟通的基本概念12.2 主要过程12.2.1 规划沟通管理12.2.2 管理沟通12.2.3 控制沟通 12.3 常见问题 上篇&#xff1a;第十一章、项目人力资源管理 第十二章 沟通管理 沟通管理在项目计划、执行、监控过程中具有重要的作用&#xff0c;项目经理应该拿…

【笔试强训选择题】Day47.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…

笔试强训

&#x1f449;&#x1f3fb; Day3 字符串中找出最长的字符串 mycode&#xff1a; #include <iostream> #include<vector>using namespace std;int main() {vector<string> v;string str;getline(cin,str);for(int i 0;i<str.size();i){string s;while(i…

手持式静电场测试仪的功能说明

手持式静电场测试仪是一种便携式的测试仪器&#xff0c;能够快速、准确地测量静电场的强度和分布情况。其主要功能包括&#xff1a; 测量静电场强度&#xff1a;手持式静电场测试仪可以测量静电场的强度&#xff0c;包括静电场的电压、电场强度、电势差等参数。 测量静电电荷&…

(搞定)排序数据结构(1)插入排序 选择排序+冒泡排序

目录 本章内容如下 一:插入排序 1.1插入排序 1.2希尔排序 二&#xff1a;选择排序 2.1选择排序 三:交换排序 3.1冒泡排序 一:插入排序 1.1直接插入排序 说到排序&#xff0c;其实在我们生活中非常常见&…

谈谈最近招人的感受!

最近折腾新的项目&#xff0c;面试了很多实习生小伙伴&#xff0c;我说说我的一些「面试」感受&#xff0c; 虽然是一个老生常谈的话题&#xff0c;但是依然提一下。 准时很重要&#xff1a;提前一点时间&#xff0c;踩个点&#xff0c;别迟到&#xff0c;面试的过程中由于每个…

Python 模拟刮刮乐小游戏

"""刮刮乐小游戏知识点&#xff1a;1、随机模块 random2、嵌套循环 while for3、条件语句/跳转语句 if / continue4、列表添加元素函数 append()"""# 随机模块 import randomwhile True:# 奖品信息prize_info [一等奖, 二等奖, 三等奖, 谢谢惠顾…

交易日均千万订单的存储架构设计与实践 | 京东物流技术团队

一、订单系统概述 1.1 业务范围 服务业务线&#xff1a;快递、快运、中小件、大件、冷链、国际、B2B合同物流、CLPS、京喜、三入三出&#xff08;采购入、退货入、调拨入、销售出、退供出、调拨出&#xff09;等 1.2 订单中心价值 1、解耦&#xff08;提升系统稳定性&#…

基于Spring Boot的房屋租赁系统

目录 前言 一、技术栈 二、系统功能介绍 租客功能模块的实现 ​编辑 管理员功能模块的实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 房屋是人类生活栖息的重要场所&#xff0c;随着城市中的流动人口的增多&#xff0c;人们对房屋租赁需求越来越高…

Unity HDR 无线延申的网格效果

无线延申的网格 该项目必须是再HDR项目 shader代码实现 Shader "Unlit/infTutorial1" {Properties{_Alpha ("Alpha", Range(0, 0.5)) 0.5}SubShader{Tags{"RenderPipeline""UniversalRenderPipeline""RenderType""…

【Java】基于物联网技术的智慧工地源码(项目端、监管端、APP端、智慧大屏)

智慧工地是将云计算、大数据、物联网、移动技术和智能设备等信息化技术手段&#xff0c;聚集在建筑工地施工管理现场&#xff0c;围绕人员、机械、物料、环境等关键要素&#xff0c;建立智能信息采集、高效协同管理、数据科学分析、过程智慧预测&#xff0c;最终实现建筑工地的…

工厂漏水怎么预防?教你一招,百试百灵

随着工业化的迅速发展&#xff0c;工厂和生产设施在现代社会中扮演着至关重要的角色。然而&#xff0c;这些设施在日常运营中也面临着各种各样的风险和挑战&#xff0c;其中之一是水浸事件。 水浸事件可能是由于天灾、设备故障、管道泄漏或人为失误等原因引发的&#xff0c;但无…

单片机上软字库换32进制存储,空间占用少20%

在之前的单片机字库建立的推送中: https://blog.csdn.net/platform/article/details/130742775&#xff0c; 存储了GB2312字符集对应的软字库文件&#xff0c;在16*16的编码下总字库的507KB&#xff0c;后来把字体切换成了12*12&#xff0c;软字库缩减到了301KB。当然这里面对…

速卖通商品详情数据接口

速卖通商品详情数据接口&#xff08;aliexpress商品详情API接口&#xff09;可以获取到速卖通商品的详细信息&#xff0c;如商品标题、价格、库存、详情描述、图片等。 速卖通商品详情API接口是速卖通提供的一种产品数据接口&#xff0c;可以帮助速卖通卖家快速地将产品分类、…

一个高效、简洁、轻量的一站式研发管理平台,协作一站式

一、开源项目简介 Codes 是一个 高效、简洁、轻量的一站式研发管理平台。包含需求管理&#xff0c;任务管理&#xff0c;测试管理&#xff0c;缺陷管理&#xff0c;自动化测试&#xff0c;cicd 等功能&#xff1b;Codes 帮助企业加速融合研发、测试、运维一体化进程 常态下,刀…

正态分布的概率密度函数|正态分布检验|Q-Q图

在正态分布的概率密度函数中&#xff0c;自变量 X 是一个随机变量&#xff0c;表示我们要研究或测量的某一现象或事件的取值。正态分布的概率密度函数用来描述这个随机变量的概率分布情况&#xff0c;即在不同取值上的概率密度。 具体来说&#xff0c;对于正态分布的概率密度函…