【数据结构】剖析二叉树(Binary Tree)

news2024/11/16 9:41:00

目录

💯引言

💯二叉树的定义与基本概念

(一)定义

(二)节点结构

(三)二叉树的形态

💯二叉树的遍历

(一)前序遍历(Preorder Traversal)

(二)中序遍历(Inorder Traversal)

(三)后序遍历(Postorder Traversal)

(四)层序遍历(Level-order Traversal)

💯二叉树的应用

⭐搜索二叉树(Binary Search Tree)

⭐平衡二叉树(AVL Tree)

⭐其他应用

💯结论


💯引言

在计算机科学的数据结构领域中,二叉树是一种极为重要且应用广泛的结构。它就像一棵倒立的树,每个节点最多有两个分支,这种简单而又富有规律的结构为解决众多实际问题提供了高效的方法。

从文件系统的目录结构到数据库的索引,从算法设计中的搜索排序人工智能中的决策树二叉树都扮演着关键的角色

💯二叉树的定义与基本概念

(一)定义

二叉树(Binary Tree)是一种由节点组成的特殊数据结构。它由个节点构成的有限集合,当时,为空二叉树;当 n > 0 时满足以下条件:

  1. 有且仅有一个根节点。
  2. 每个节点最多有两棵子树,分别称为左子树右子树

(二)节点结构

二叉树的节点包含以下关键部分

  1. 数据域:用于存储节点所承载的数据信息。数据类型灵活多样,可以是整数、字符、结构体等,根据具体的应用需求而定。
  2. 左指针:指向该节点左子树的根节点。若左子树为空,则左指针的值为NULL
  3. 右指针:指向该节点右子树的根节点。同理,当右子树为空时,右指针为NULL

例如,在 C 语言中,二叉树节点结构体可定义为:

typedef struct TreeNode {
    int data;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

(三)二叉树的形态

 

二叉树呈现出多种形态,各有其特点和应用场景

  1. 空二叉树:没有任何节点,是二叉树的初始状态,也是一种特殊情况,可形象地表示为一个空白的区域,象征着尚未填充数据的结构。
  2. 单节点二叉树:仅有一个节点,该节点既是根节点,也是整棵树的唯一元素。它就像一颗孤独的星星,在数据的天空中独自闪耀。
  3. 满二叉树:所有节点都满足度为2,即每个节点都有左右两个子节点,且所有叶子节点都在同一层。满二叉树在给定高度时,拥有最多的节点数,其节点总数2^{h}-1,其中 h 为树的高度。它是一种结构规整、对称美观的二叉树形态,像一个完美的晶体结构,蕴含着内在的平衡与规律。满二叉树如图
  4. 完全二叉树:对于一棵深度为、有个节点的二叉树,如果其节点编号从到与深度为的满二叉树中编号从到的节点位置完全相同。它在一定程度上结合了满二叉树的规整性和灵活性。 

        完全二叉树如图: 

 

💯二叉树的遍历

所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次遍历二叉树就像是在探索一座神秘的花园,依次访问每一个节点,以获取其中的数据或执行特定的操作。常见的遍历方式有以下几种:

(一)前序遍历(Preorder Traversal)

  1. 访问顺序:根节点 -> 左子树 -> 右子树。
    • 就像先探索花园的中心,然后向左扩展,最后向右延伸。
  2. 算法步骤
    • 首先访问根节点,输出其数据。
    • 然后递归地对左子树进行前序遍历。
    • 最后递归地对右子树进行前序遍历。
  3. 示例代码(以 C 语言为例)
void preorderTraversal(TreeNode *root) {
    if (root == NULL) {
        return;
    }
    printf("%d ", root->data);
    preorderTraversal(root->left);
    preorderTraversal(root->right);
}

 

(二)中序遍历(Inorder Traversal)

  1. 访问顺序:左子树 -> 根节点 -> 右子树。
    • 如同先深入花园的左侧,然后回到中心,最后探索右侧。
  2. 算法步骤
    • 首先递归地对左子树进行中序遍历。
    • 然后访问根节点,输出其数据。
    • 最后递归地对右子树进行中序遍历。
  3. 示例代码
void inorderTraversal(TreeNode *root) {
    if (root == NULL) {
        return;
    }
    inorderTraversal(root->left);
    printf("%d ", root->data);
    inorderTraversal(root->right);
}

从左子树开始,到根节点,再到右子树

 

(三)后序遍历(Postorder Traversal)

  1. 访问顺序:左子树 -> 右子树 -> 根节点。
    • 先探索花园的左右两侧,最后回到中心。
  2. 算法步骤
    • 首先递归地对左子树进行后序遍历。
    • 然后递归地对右子树进行后序遍历。
    • 最后访问根节点,输出其数据。
  3. 示例代码
void postorderTraversal(TreeNode *root) {
    if (root == NULL) {
        return;
    }
    postorderTraversal(root->left);
    postorderTraversal(root->right);
    printf("%d ", root->data);
}

先处理左右子树,最后访问根节点

 

(四)层序遍历(Level-order Traversal)

  1. 访问顺序:按照从根节点开始,从上到下、从左到右的顺序依次访问每一层的节点。
    • 就像一层一层地扫描花园,确保每一个角落都被探索到。
  2. 算法步骤
    • 使用一个队列来存储待访问的节点。
    • 首先将根节点入队。
    • 当队列不为空时,取出队首节点,访问该节点的数据。
    • 如果该节点有左子树,将左子树的根节点入队。
    • 如果该节点有右子树,将右子树的根节点入队。
  3. 示例代码
#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode {
    int data;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

typedef struct QueueNode {
    TreeNode *data;
    struct QueueNode *next;
} QueueNode;

typedef struct Queue {
    QueueNode *front;
    QueueNode *rear;
} Queue;

void initQueue(Queue *q) {
    q->front = q->rear = NULL;
}

int isQueueEmpty(Queue *q) {
    return q->front == NULL;
}

void enqueue(Queue *q, TreeNode *data) {
    QueueNode *newNode = (QueueNode *)malloc(sizeof(QueueNode));
    newNode->data = data;
    newNode->next = NULL;
    if (isQueueEmpty(q)) {
        q->front = q->rear = newNode;
    } else {
        q->rear->next = newNode;
        q->rear = newNode;
    }
}

TreeNode *dequeue(Queue *q) {
    if (isQueueEmpty(q)) {
        printf("Queue is empty!\n");
        return NULL;
    }
    QueueNode *temp = q->front;
    TreeNode *data = temp->data;
    q->front = q->front->next;
    if (q->front == NULL) {
        q->rear = NULL;
    }
    free(temp);
    return data;
}

void levelOrderTraversal(TreeNode *root) {
    if (root == NULL) {
        return;
    }
    Queue q;
    initQueue(&q);
    enqueue(&q, root);
    while (!isQueueEmpty(&q)) {
        TreeNode *node = dequeue(&q);
        printf("%d ", node->data);
        if (node->left!= NULL) {
            enqueue(&q, node->left);
        }
        if (node->right!= NULL) {
            enqueue(&q, node->right);
        }
    }
}

  层序遍历如图: 

 

💯二叉树的应用

二叉树在计算机科学的各个领域都有着广泛的应用,以下是一些常见的例子:

⭐搜索二叉树(Binary Search Tree)

  1. 定义与特点:搜索二叉树是一种特殊的二叉树,对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,其右子树中的所有节点的值都大于该节点的值
    • 这种有序性使得在搜索二叉树中进行查找、插入和删除操作具有较高的效率。
  2. 查找操作:从根节点开始比较要查找的值与当前节点的值,如果要查找的值小于当前节点的值,则在左子树中继续查找;如果要查找的值大于当前节点的值,则在右子树中继续查找。
  3. 插入操作:同样从根节点开始比较要插入的值与当前节点的值,根据大小关系在合适的位置插入新节点。
  4. 删除操作:先找到要删除的节点,根据节点的情况进行不同的处理,如节点没有子节点、有一个子节点或有两个子节点等。

搜索二叉树如图: 

 

⭐平衡二叉树(AVL Tree)

  1. 定义与意义:平衡二叉树是一种特殊的二叉搜索树,要求任何节点的左右子树的高度差不超过 1 
    • 这种平衡特性可以保证在进行插入、删除等操作时,树的高度始终保持在较低的水平,从而提高操作的效率。
  2. 平衡调整算法:当树失去平衡时,通过左旋、右旋等操作来调整树的结构,使其重新满足平衡二叉树的定义。

平衡二叉树如图:

 

⭐其他应用

二叉树还可以用于表达式树、决策树等领域,在编译器设计、人工智能等方面发挥着重要作用。

 

💯结论

总之,二叉树以其简洁而强大的结构,成为了计算机科学领域中不可或缺的一部分。从基础的数据存储到高级的算法设计,它都发挥着至关重要的作用。我们应当珍视二叉树所带来的启示,不断学习和探索其更多的应用场景。


💝💝💝感谢你看到最后,点个赞再走吧!💝💝💝 

以下是一个投票,欢迎你参与,让我们一起了解大家对二叉树的认知和兴趣程度: 

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

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

相关文章

机器人控制器设计与编程基础实验高效版本-ESP32等单片机实验报告

只需要课程大纲或进度表wokwi 大模型工具&#xff0c;就可以完全掌握嵌入式系统基础实验的所有核心点。 LCD // Learn about the ESP32 WiFi simulation in // https://docs.wokwi.com/guides/esp32-wifi https://wokwi.com/projects/321525495180034642#include <WiFi.h>…

【AI学习】Lilian Weng:What are Diffusion Models?

读OpenAI 的 Lilian Weng博客《What are Diffusion Models?》 文章链接:https://lilianweng.github.io/posts/2021-07-11-diffusion-models/ 通过浏览器的在线翻译&#xff0c;直接截图了。翻译的有些问题&#xff0c;但是基本能大概看明白了。 我只是个人的记录&#xff0c;…

开发经验总结: 读写分离简单实现

背景 使用mysql的代理中间件&#xff0c;某些接口如果主从同步延迟大&#xff0c;容易出现逻辑问题。所以程序中没有直接使用这个中间件。 依赖程序逻辑&#xff0c;如果有一些接口可以走读库&#xff0c;需要一个可以显示指定读库的方式来连接读库&#xff0c;降低主库的压力…

降准降息一揽子措施点燃 A 股激情,4% 大涨之后趋势深度剖析

文章目录 牛回速归原因分析引爆点情绪和信心一根大阳线&#xff0c;千军万马来相见阴霾是否一扫而空还未可知 流动性和增量 潜在隐患等待经济复苏配套政策期待中美关系进展 短期内趋势分析空军短期内仍有余力如何看待第2日的回撤外围 趋势分析结论短期内可能仍有波折中长期会是…

【数学分析笔记】第3章第4节闭区间上的连续函数(1)

3. 函数极限与连续函数 3.4 闭区间上的连续函数 3.4.1 有界性定理 【定理3.4.1】 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上连续&#xff0c;则 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上有界。 【证】用反证法&#xff0c;假设 f ( x ) f(x) f(x)在 [ …

2-103 基于matlab的光电信号下血氧饱和度计算

基于matlab的光电信号下血氧饱和度计算&#xff0c;光转换成电信号时&#xff0c;由于动脉对光的吸收有变化而其他组织对光的吸收基本不变&#xff0c;得到的信号就可以分为直流DC信号和交流AC信号。提取AC信号&#xff0c;就能反应出血液流动的特点。这种技术叫做光电容积脉搏…

【Linux学习】2-1 Linux系统下运行C语言输出hello word

1.双击打开VMware软件&#xff0c;点击开启此虚拟机后&#xff0c;等待点击头像输入密码进入 2.“CtrlAltt”调出命令行终端&#xff0c;输入命令sudo apt-get install vim安装vim&#xff0c;输入命令sudo apt-get install gcc安装gcc 3.输入命令vi hello.c进入C语言编写环境&…

Linux —— Socket编程(一)

一、本篇重点 1. 认识IP地址、端口号、网络字节序等网络编程中的基本概念 2. 学习Socket api的基本用法 3. 能够实现一个简单的udp客户端/服务器 二、基本概念 1. 理解源IP地址和目的IP地址 简单的理解&#xff0c;IP地址是用于标识一台机器的&#xff0c;我们通过IP地址去…

使用 UWA Gears 测试小游戏性能

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 随着小游戏的规模和用户量持续增长&#xff0c;玩家对于小游戏的性能要求也越来越高。为了能够给玩…

力扣234 回文链表 Java版本

文章目录 题目描述代码 题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 示例 2&…

【ASE】第三课_山丘颜色梯度效果

今天我们一起来学习ASE插件&#xff0c;希望各位点个关注&#xff0c;一起跟随我的步伐 今天我们来学习山丘的颜色梯度显示&#xff0c;根据不同的高度显示不同的颜色 最终效果&#xff1a; 思路&#xff1a; 1.先加载模型的纹理贴图和法线贴图 2. 获得模型世界顶点Y向量&am…

【渗透测试】-灵当CRM系统-sql注入漏洞复现

文章目录 概要   灵当CRM系统sql注入漏洞&#xff1a;   具体实例&#xff1a;  技术名词解释  小结 概要 近期灵当CRM系统爆出sql注入漏洞&#xff0c;我们来进行nday复现。 灵当CRM系统sql注入漏洞&#xff1a; Python sqlmap.py -u "http://0.0.0.0:0000/c…

当okhttp网络库遇到不规范的http状态码

如题&#xff0c;最近工作遇到的问题&#xff0c;我们的 Android 应用网络请求埋点报表&#xff0c;收集到了奇怪的网络请求异常&#xff1b;通过日志收集与分析&#xff0c;确定到是服务器返回了不规范的状态码所导致。 如上是根据线上的业务场景&#xff0c;本地写个简单的M…

二进制位运算题

本期介绍&#x1f356; 主要介绍&#xff1a;1. 在不创建临时变量的情况下交换两个变量&#xff0c;2. 计算变量在内存中存放2进制位“1”的个数&#xff0c;3. 求两个数的二进制中不同位的个数&#xff0c;4. 分别打印整数的二进制中奇数位和偶数位&#xff0c;5. 判断一个整数…

SentencePiece进行文本分类

SentencePieces 前言 Step1:故事 SentencePiece 是一个无监督的文本分词器和 detokenizer(还原回去的&#xff1f;)主要用于词汇表大小是预定的文本生成系统中它拓展了原始句子的训练&#xff0c;实现子词单元如 BPE 和 unigram language model技术亮点 纯数据驱动&#xff…

Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作

文章目录 1、AB分区镜像制作2、uboot修改3、镜像启动 在上一篇 Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动中&#xff0c;我们通过buildroot制作了根文件系统&#xff0c;并通过 SD卡的形式将其挂载到设备并成功进行了启动&#xff0c;但上一章中&#xff0c;我们的…

车载应用的多功能需求与公安、金融等行业的应用特点

随着科技的快速发展&#xff0c;车载应用的功能需求也日益多样化。除了基本的视频监控功能外&#xff0c;现代车载应用还需满足一系列高级功能&#xff0c;如无线网络视频监控、GPS卫星定位、车辆调度、语音报站、行驶信息记录以及多媒体娱乐广告播放等。这些功能在公安、金融等…

2024年数字化转型与管理国际学术会议(DTM 2024)

目录 重要信息 大会简介 大会组委 征稿主题 论文出版 会议议程 参会方式 重要信息 大会官网&#xff1a;www.icemme.org&#xff08;点击了解大会&#xff0c;投稿等详细信息&#xff09; 大会时间&#xff1a;2024年11月22-24日 大会地点&#xff1a;中国-大连 大会…

三维重建的几何评价指标

1.三维重建的几何评价指标 1.1 Chamfer Distance Geometry quality (1) Chamfer Distance&#xff08;CD&#xff09; CD衡量两组点云之间的几何差异&#xff0c;距离越小越好。 CD是一种用于衡量两个点云之间相似度的常用几何评价指标。它计算一个点云中每个点到另一个点云的…

Qt5.15和Qt6.7配置Android开发环境

最近重新安装了Qt5.15.2和Qt6.7.2,使用Qt Creator14.0.1,配置Android开发环境时又碰到了一些问题,记录如下。 1、Qt6.7.2使用AndroidStudio的JDK 因为系统原来安装了AndroidStudio2024,系统自动检测了JDK位置,点击设置SDK,可以自动安装好相应的NDK。 打开Qt Creator14…