树(Tree) - 概念与基础


树的基本概念

树(Tree)是一种重要的数据结构,它在计算机科学中被广泛应用于各种算法和程序中。树是由节点(node)组成的层次结构,其中每个节点都有一个父节点,除了根节点外,每个节点都有零个或多个子节点。树的一个关键特点是没有循环路径:从任何节点开始,通过父节点到达任何其他节点都是唯一的。
二叉树

树的基本术语

节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点
非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G…等节点为分支节点
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点
节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
森林:由m(m>0)棵互不相交的树的集合称为森林

常见类型的树

二叉树 (Binary Tree)
二叉搜索树(Binary Search Tree,BST)
平衡树(Balanced Tree)

树的表示

我们经常用孩子兄弟表示法进行树的结构表示

  • 同层为兄弟关系
  • 上下层为双亲与孩子的关系

表示法的代码构成:

typedef int Datatype;

struct Node
{
    struct Node* first_Child;  // 指向父亲对应的下一层的第一个孩子
    struct Node* nextBrother;  // 指向该层的下一个兄弟节点

    // 每个节点存放的数据
} 

图示:
image.png

二叉树的概念和结构

二叉树(Binary Tree)是一种重要的数据结构,它由节点(node)组成的层次结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树在计算机科学中被广泛应用,是许多其他数据结构和算法的基础。

二叉树的概念

根节点(Root):二叉树的顶部节点,它是整棵树的起点,没有父节点。

父节点(Parent):每个节点都有一个父节点,除了根节点外。父节点连接着它的子节点。

子节点(Child):每个节点最多有两个子节点,分别称为左子节点和右子节点。如果某个节点只有一个子节点或没有子节点,则相应的子节点为空。

叶子节点(Leaf):没有子节点的节点称为叶子节点。叶子节点位于树的底部,是树的末端。

二叉树的结构

       1
     /   \
    2     3
   / \   / \
  4   5 6   7
  • 每个节点最多有两个子节点:每个节点最多有两个子节点,分别是左子节点和右子节点。

  • 层次结构:二叉树是一种层次结构,每个节点的深度可以通过从根节点开始向下计算得到。

  • 唯一路径:从根节点到任何其他节点都有唯一的路径,这保证了树的无环结构。

特殊的二叉树类型

  1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是
    说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。
  1. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K
    的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对
    应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

二叉树的存储结构

顺序存储

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空
间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺
序存储在物理上是一个数组,在逻辑上是一颗二叉树。

image.png

链式存储

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是
链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所
在的链结点的存储地址 。

image.png

链式存储示例代码:

#include <stdio.h>
#include <stdlib.h>

// 定义二叉树节点结构
typedef struct TreeNode 
{
    int data;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;

// 创建新节点
TreeNode* createNode(int value) 
{
    TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
    if (newNode == NULL) 
    {
        printf("Memory allocation failed!\n");
        exit(1);
    }
    newNode->data = value;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

// 主函数
int main() 
{
    // 创建二叉树节点
    TreeNode* root = createNode(1);
    root->left = createNode(2);
    root->right = createNode(3);
    root->left->left = createNode(4);
    root->left->right = createNode(5);

    // 访问节点值并输出
    printf("Binary Tree Structure:\n");
    printf("      %d\n", root->data);
    printf("     /  \\ \n");
    printf("    %d    %d\n", root->left->data, root->right->data);
    printf("   / \\ \n");
    printf("  %d   %d\n", root->left->left->data, root->left->right->data);

    return 0;
}

                                                 _感谢阅读_

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

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

相关文章

Deep Unsupervised Learning using Nonequilibrium Thermodynamics

就直接从算法部分开始了&#xff1a; 2 算法 我们的目标是定义一个前向&#xff08;或者推理&#xff09;扩散过程&#xff0c;这个过程能够转换任意的复杂数据分部到一个简单、tractable、分布&#xff0c;并且学习有限时间扩散过程的反转 从而 定义我们的生成模型分布。我们…

SpringBoot整合Flowable/Activiti

SpringBoot版本: 2.0.1.RELEASE Flowable版本: 6.3.1 Activiti版本: 6.0.0 一.添加pom依赖 因为之前我整合的时候有报错关于sqlsession的错误,后面查询文章才发现flowable要排除掉mybatis,又没说具体排除哪一个,所以我这干脆全部排除了 <!-- Flowable dependencies -->…

【MATLAB源码-第32期】基于matlab的通信及雷达中常用伪随机码m序列的仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 M序列&#xff0c;也称为最大长度序列或者伪随机序列&#xff0c;是一种特殊的二进制序列。它的特点是在有限的长度内&#xff0c;尽管它是伪随机的&#xff0c;但它会在特定的周期内不重复地循环。 在数学上&#xff0c;M序…

应急响应实战笔记04Windows实战篇(5)

第5篇&#xff1a;挖矿病毒&#xff08;一&#xff09; 0x00 前言 ​ 随着虚拟货币的疯狂炒作&#xff0c;挖矿病毒已经成为不法分子利用最为频繁的攻击方式之一。病毒传播者可以利用个人电脑或服务器进行挖矿&#xff0c;具体现象为电脑CPU占用率高&#xff0c;C盘可使用空间…

CSS基础:语法、注释以及注释的3个注意事项

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。1枚程序媛&#xff0c;大专生&#xff0c;2年时间从1800到月入过万&#xff0c;工作5年买房。 分享成长心得。 259篇原创内容-公众号 后台回复“前端工具”可获取开发工具&#xff0c;持续更新…

Vulnhub:WESTWILD: 1.1

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirmap enm4ulinux sumbclient get flag1 ssh登录 提权 横向移动 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 0…

Python 一步一步教你用pyglet制作“彩色方块连连看”游戏(续)

“彩色方块连连看”游戏(续) 上期讲到相同的色块连接&#xff0c;链接见&#xff1a; Python 一步一步教你用pyglet制作“彩色方块连连看”游戏-CSDN博客 第八步 续上期&#xff0c;接下来要实现相邻方块的连线&#xff1a; 首先来进一步扩展 行列的类&#xff1a; class R…

Template Basic

本系列均参考https://github.com/bonfy/go-mega/blob/master/02-template-basic.md 只是为了监督自己写的博客 这里就不介绍什么是模板了&#xff0c;一般来说&#xff0c;我们使用html文件作为我们的模板文件 我们首先创建一个 类似于这样的模板 package mainimport (&quo…

《数字图像处理》-上机 5 图像阈值化处理、霍夫变换及形态学算法

一、上机目的 学习图像阈值化处理、霍夫变换、形态学算法及编程实现方法 二、相关知识及练习 1、图像阈值化处理 图像阈值化&#xff08;Binarization&#xff09;旨在剔除掉图像中一些低于或高于一定值的像素&#xff0c;从而提 取图像中的物体&#xff0c;将图像的背景和…

ComfyUI ClipSeg插件报错- resize_image出错应该怎么办

上一篇刚介绍了这个插件&#xff0c;结果emm..很快发现事情并不简单...结果又报错了。 后台报错信息&#xff1a; Unused or unrecognized kwargs: padding. !!! Exception during processing !!! Traceback (most recent call last): File "F:\ComfyUI-aki\execution.p…

4.2总结

了解了部分Api的使用并学习了接口的API API API包含了较多种类&#xff08;System,Runtime等&#xff09; System其实就是一个工具类&#xff0c;提供了一些与系统相关的方法 下面有一些常间的System方法 方法名说明public static void exit (int status)终止当前运行的ja…

配置code-server和texlive实现网页写tex

使用overleaf太卡了&#xff0c;有云服务器或者nas小主机&#xff0c;配置自己的code-servertexlive&#xff0c;来写论文。 之前用服务器配置过自己的overleaf&#xff0c;感觉不是很好用&#xff0c;缺少东西。 一、思路 使用docker先安装一个ubuntu&#xff0c;用dockerfil…

基于Python的微博舆论分析,微博评论情感分析可视化系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

c 语言 插值搜索(Interpolation Search)

给定一个由 n 个均匀分布值 arr[] 组成的排序数组&#xff0c;编写一个函数来搜索数组中的特定元素 x。 线性搜索需要 O(n) 时间找到元素&#xff0c;跳转搜索需要 O(? n) 时间&#xff0c;二分搜索需要 O(log n) 时间。 插值搜索是对实例二分搜索的改进&#xff0c;…

(Mac/win)Lightroom Classic 2024---摄影师的必备工具,解锁图片处理新境界

Lightroom Classic 2024是一款由Adobe公司推出的专业照片编辑和管理软件。它提供了全面的照片处理工具&#xff0c;包括裁剪、色彩调整、滤镜等&#xff0c;并支持RAW格式编辑。该软件以强大的组织和管理功能闻名&#xff0c;允许用户通过关键字、标签等方式轻松查找和整理照片…

SAP新的扩展策略

在软件即服务&#xff08;SaaS&#xff09;应用的推动下&#xff0c;SAP Cloud优先的战略非常明显&#xff0c;随之带来的是SAP Clean core的战略&#xff0c;从经典的 ABAP 可扩展性模式转变为 SAP S/4HANA 现代可扩展性模式。那么Clean core战略到底是什么&#xff1f;新的扩…

MATLAB 统计滤波(去除点云噪声)(55)

MATLAB 统计滤波法(去除点云噪声)(55) 一、算法介绍二、算法实现1.原理2.代码一、算法介绍 点云统计滤波,是一种常用的去噪点方法,原始的点云数据中包含多种噪点,无法直接使用,往往需要通过一些方法去除噪点,而统计滤波在这方面的使用非常广泛常见,下面是去噪点后的…

书生作业2

Task 1 生成200字以上的笑话&#xff0c;可以看到使用不同的提示词&#xff0c;会有不同的效果。 如果使用提示词“讲一个笑话.200字以上”&#xff0c; 会有偶发的输出较短的笑话的情况。 如果使用提示词“讲一个200字以上的笑话”时&#xff0c;结果相对稳定。 下载目前两种…

MinGW使用std::thread报错error: ‘thread‘ is not a member of ‘std‘

目录 问题描述简单的测试代码报错及解决 问题描述 在windows上用vscode编写c代码进行编译时&#xff0c;一直上报error: ‘thread’ is not a member of std’的错误&#xff0c;搜索该错误上报都是说c版本不匹配&#xff0c;然后我在task.json里面添加了-stdc11之后还是报错&…

【Vue】watch监听复杂数据,新值与旧值一样

问题 watch监听复杂数据&#xff0c;例如数组&#xff0c;旧值与新值一样 解决方案 监听回调里返回新数组&#xff0c;新、旧数组地址改变&#xff0c;得到的值也就不一样&#xff0c;例↓ ()>[...data] 码 test.js // 数据 const musicList ref([{ id: 540000200805…