【数据结构(四)】树

news2025/1/18 6:55:03

文章目录

    • 1 树的基本概念
      • 1.1 树的定义
      • 1.2 基本术语
      • 1.3 数的性质
    • 2 二叉树的概念
      • 2.1 二叉树的定义与特性
        • 2.1.1 定义
        • 2.1.2 二叉树的性质
      • 2.2 几种特殊的二叉树
        • 2.2.1 满二叉树
        • 2.2.2 完全二叉树
      • 2.3 二叉树的存储结构
        • 2.3.1 顺序存储
        • 2.3.2 链式存储
    • 3 二叉树的遍历和线索二叉树
      • 3.1 二叉树的遍历
        • 3.1.1 先序遍历(根左右)
        • 3.1.2 中序遍历(左根右)
        • 3.1.3 后续遍历(左右根)
        • 3.1.4 二叉树的层次遍历
        • 3.1.5 由遍历序列构造二叉树
      • 3.2 线索二叉树

1 树的基本概念

1.1 树的定义

在这里插入图片描述

树是n(n>=0)个结点的有限集,树除了根节点外,任何一个结点都有且仅有一个前驱

  • 空树:结点数为0的树
  • 非空树的特性:
    • 有且仅有一个根节点
    • 没有后继的结点称为“叶子结点”(或终端结点)
    • 有后继的结点称为“分支结点”(或非终端结点)
  • 子树:在互不相交的有限集合中,每个集合本身又是一棵树,称为根结点的子树(如上图A有三颗子树B、C、D)

1.2 基本术语

  1. 结点之间的关系描述
    • 祖先、子孙、双亲、兄弟…结点
    • 路径、路径长度
  2. 结点、树的属性描述
    • 结点的层次(深度)——从上往下
    • 结点的高度——从下往上
    • 树的高度——总共多少层
    • 结点的度——有几个孩子
    • 树的度——各结点的度的最大值
  3. 有序树、无序树
  4. 森林:是m(m>=0)棵互不相交的树的集合

1.3 数的性质

  1. 树中的结点数等于所有结点的度数之和加1。
  2. 度为m的树第i层上至多有m^i-1个结点
  3. 度为m的数、m叉数的区别

2 二叉树的概念

2.1 二叉树的定义与特性

2.1.1 定义

二叉树是n(n>=0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两颗互不相交的分别称作这个根的左子树和右子树的二叉树组成。
  特点:1.每个结点最多有俩孩子(二叉树中不存在度大于2的结点)。
     2. 二叉树可以是空集合,根可以有空的左子树和空的右子树。
     3. 二叉树有左右之分,次序不能颠倒。

在这里插入图片描述


2.1.2 二叉树的性质

  1. 在二叉树的第i层上至多有2^(i-1)个结点(i>1)。
  2. 深度为k的二叉树至多有2^k-1个结点(k>=1)。
  3. 对任何一颗二叉树T,如果其叶子数为n0,度为2的结点数为n2,则n0=n2+1.
  4. 具有n个结点的完全二叉树的深度为(log2N)+1。
  5. 如果对一棵有n个结点的完全二叉树(深度为log2n+1)的结点按层序编号(从第1层到第log2n+1层,每层从左到右),则对任一结点i(1<=i<=n),有:
    1. 如果i=1,则结点i是二叉树的根,无双亲;
      如果i>1,则其双亲是结点i/2.
    2. 如果2i>n,则结点i为叶子结点,无左孩子;
      否则,其左孩子是结点2i。
    3. 如果2i+1>n,则结点i无右孩子;
      否则,其右孩子是结点2i+1。

注意:二叉树不是树的特殊情况,它们是两个概念。


2.2 几种特殊的二叉树

2.2.1 满二叉树

一颗深度为k且有2^k-1个结点的二叉树称为满二叉树。每一层上的结点数都达到最大。叶子全部在最低层。
  特点:1. 只有最后一层有叶子结点
     2. 不存在度为1的结点
     3. 按层序从1开始编号,结点i的左孩子为2i,右孩子为2i+1;结点i的父亲结点为i/2(如果有的话)

在这里插入图片描述

2.2.2 完全二叉树

深度为k的具有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号为1~n的结点一 一对应时,称之为完全二叉树。
  特点:1. 只有最后两层可能有叶子结点
     2. 最多只有一个度为1的结点
     3. 按层序从1开始编号,结点i的左孩子为2i,右孩子为2i+1;结点i的父亲结点为i/2(如果有的话)
     4. i<=n/2为分支结点,i>n/2为叶子结点

在这里插入图片描述

  1. 二叉排序树
  2. 平衡二叉树

2.3 二叉树的存储结构

2.3.1 顺序存储

二叉树的顺序存储中,一定要把二叉树的结点编号与完全二叉树对应起来;

#define MaxSize 100

struct TreeNode{
   ElemType value; //结点中的数据元素
   bool isEmpty;   //结点是否为空
}

main(){
   TreeNode t[MaxSize];
   for (int i=0; i<MaxSize; i++){
      t[i].isEmpty = true;
   }
}

2.3.2 链式存储

//二叉树的结点
struct ElemType{
   int value;
};

typedef struct BiTnode{
   ElemType data;          			//数据域
   struct BiTNode *lchild, *rchild; //左、右孩子指针
}BiTNode, *BiTree;

//定义一棵空树
BiTree root = NULL;

//插入根节点
root = (BiTree) malloc (sizeof(BiTNode));
root -> data = {1};
root -> lchild = NULL;
root -> rchild = NULL;

//插入新结点
BiTNode *p = (BiTree) malloc (sizeof(BiTNode));
p -> data = {2};
p -> lchild = NULL;
p -> rchild = NULL;
root -> lchild = p; 				//作为根节点的左孩子

3 二叉树的遍历和线索二叉树

3.1 二叉树的遍历

3.1.1 先序遍历(根左右)

  1. 若二叉树为空,不用操作
  2. 若二叉树非空:
    • 访问根节点
    • 先序遍历左子树
    • 先序遍历右子树
typedef struct BiTnode{
   ElemType data;          
   struct BiTNode *lchild, *rchild; 
}BiTNode, *BiTree;

void PreOrder(BiTree T){
   if(T!=NULL){
      visit(T);                 //访问根结点
      PreOrder(T->lchild);      //递归遍历左子树
      PreOrder(T->rchild);      //递归遍历右子树
   }
}

3.1.2 中序遍历(左根右)

  1. 若二叉树为空,不用操作
  2. 若二叉树非空:
    • 先序遍历左子树
    • 访问根节点
    • 先序遍历右子树
typedef struct BiTnode{
   ElemType data;          
   struct BiTNode *lchild, *rchild; 
}BiTNode, *BiTree;

void InOrder(BiTree T){
   if(T!=NULL){
      InOrder(T->lchild);       //递归遍历左子树
      visit(T);                 //访问根结点
      InOrder(T->rchild);       //递归遍历右子树
   }
}

3.1.3 后续遍历(左右根)

  1. 若二叉树为空,不用操作
  2. 若二叉树非空:
    • 先序遍历左子树
    • 先序遍历右子树
    • 访问根节点
typedef struct BiTnode{
   ElemType data;          
   struct BiTNode *lchild, *rchild; 
}BiTNode, *BiTree;

void PostOrder(BiTree T){
   if(T!=NULL){
      PostOrder(T->lchild);       //递归遍历左子树    
      PostOrder(T->rchild);       //递归遍历右子树
      visit(T);                 //访问根结点
   }
}

3.1.4 二叉树的层次遍历

算法思想

  • 初始化一个辅助队列
  • 根节点入队
  • 若队列非空,则队头结点出队,访问该结点,依次将其左、右孩子插入队尾(如果有的话)
  • 重复以上操作直至队列为空
//二叉树的结点(链式存储)
typedef struct BiTnode{
   ElemType data;          
   struct BiTNode *lchild, *rchild; 
}BiTNode, *BiTree;

//链式队列结点
typedef struct LinkNode{
   BiTNode * data;
   typedef LinkNode *next;
}LinkNode;

typedef struct{
   LinkNode *front, *rear;  
}LinkQueue;

//层序遍历
void LevelOrder(BiTree T){
   LinkQueue Q;
   InitQueue (Q);          		//初始化辅助队列
   BiTree p;
   EnQueue(Q,T);           		//将根节点入队
   while(!isEmpty(Q)){     		//队列不空则循环
      DeQueue(Q,p);        		//队头结点出队
      visit(p);            		//访问出队结点
      if(p->lchild != NULL)
         EnQueue(Q,p->lchild); 	//左孩子入队
      if(p->rchild != NULL)
         EnQueue(Q,p->rchild);   //右孩子入队
   }
}

3.1.5 由遍历序列构造二叉树

  • 先序序列 + 中序序列
  • 后序序列 + 中序序列
  • 层序序列 + 中序序列


key: 找到树的根节点,并根据中序序列划分左右子树,再找到左右子树根节点


3.2 线索二叉树

  1. 线索二叉树的概念与作用
    在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。

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

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

相关文章

云端IDE系列教程:云原生 Terminal 大比拼 (看 ChatGPT 如何选择)

原文作者&#xff1a;行云创新技术总监 邓冰寒 概述 上一期在使用 Ubuntu 20.04 作为基础镜像而定制的 WeTTY 成功的在 TitanIDE 运行起来了 &#xff0c;非常适合程序员使用。能作为云原生 Terminal 的候选项目有 WeTTY、GoTTY、ttyd。接下来&#xff0c;我将在这三者中选择…

Java学习笔记 --- CSS

一、CSS技术介绍 CSS是「层样式表单」。是用于&#xff08;增强&#xff09;控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。 二、CSS语法规则 三、CSS和HTML结合方式 第一种 在标签的style属性上设置key:value value”&#xff0c;修改标签样式 <!DOCTYP…

Zynq UltraScale系列使用MIPI CSI-2 RX Subsystem 解码MIPI视频PD输出 提供2套工程源码和技术支持

目录1、前言2、设计思路和架构3、vivado工程详解4、上板调试验证5、福利&#xff1a;工程代码的获取1、前言 本设计采用OV5640摄像头MIPI模式作为输入&#xff0c;分辨率为1280x72060Hz&#xff0c;MIPI解码方案采用Xilinx官方提供的MIPI CSI-2 RX Subsystem IP解码MIPI视频&a…

开源商城系统怎么选择?

随着电子商务的发展&#xff0c;开源商城系统越来越受到市场的重视&#xff0c;无论是大型企业还是小型企业&#xff0c;都在使用开源商城系统来提高自身的竞争力。 开源商城系统的优势&#xff1f; 开源商城系统可以节省企业的开发成本&#xff0c;减少企业的研发时间&#x…

【2023unity游戏制作-mango的冒险】-5.攻击系统的简单实现

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity游戏制作 ⭐攻击系统的简单实现⭐ 文章目录⭐攻击系统的简单实现⭐&#x1f468;‍&#x1…

Ip2Region的Java本地实现

最近有个需求是将ip地址转换为对应的行政区划&#xff0c;存入数据库&#xff0c;在网上查阅相关资料&#xff0c;有ip2Region实现方案&#xff0c;记录下来&#xff0c;方便备查。 一、知识介绍 ip2region.xdb 即离线 IP 数据管理框架和定位库&#xff0c;免费。 数据格式&a…

北极星指标体系

北极星指标体系 每个产品都有很多指标,每个指标都反映了对应业务的经营情况。但是在实际业务经营中,却要求我们在不同的产品阶段寻找到合适的指标,让这个指标可以代表当前产品阶段的方向和目标,让这个指标不仅对业务经营团队,而且对产品的用户、对产品的价值都能有很好的…

多智能体集群协同控制笔记(1):线性无领航多智能体系统的一致性

对于连续时间高阶线性多智能体系统的状态方程为&#xff1a; x˙i(t)Axi(t)Bui(t),i1,2..N\dot {\mathbf{x}}_i(t)A\mathbf{x}_i(t)B\mathbf{u}_i(t),i1,2..N x˙i​(t)Axi​(t)Bui​(t),i1,2..N 下标iii代表第iii个智能体&#xff0c;ui(t)∈Rq1\mathbf{u}_i(t)\in R^{q \time…

【vulhub漏洞复现】Thinkphp 2.x 任意代码执行

一、漏洞详情影响版本 thinkphp 2.x但是由于thinkphp 3.0版本在Lite模式下没有修复该漏洞&#xff0c;所以也存在该漏洞漏洞原因&#xff1a;e 和 /e模式匹配路由&#xff1a;e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行; /e 可执行模式&#xff0c…

vue入门

一、准备 本文是基于HBuilderX工具来讲解的。 1、工具 HBuilderX 2、 二、介绍 Vue是一个做网页的框架。 一个网页都是由多个模块&#xff08;组件&#xff09;拼成的。而Vue的组件化技术正式应用了这个思想。 三、创建项目 使用HBuilderX 创建项目。 1、创建空白项目…

【联机对战】微信小程序联机游戏开发流程详解

现有一个微信小程序叫中国象棋项目&#xff0c;棋盘类的单机游戏看着有缺少了什么&#xff0c;现在给补上了&#xff0c;加个联机对战的功能&#xff0c;增加了可玩性&#xff0c;对新手来说&#xff0c;实现联机游戏还是有难度的&#xff0c;那要怎么实现的呢&#xff0c;接下…

MySQL表的增删查改(基础)

gitee:博客中的所有操作整合新增语法:insert [into] table_name values(value_list)[案例] 创建一个学生表进行数据插入1.1单行数据全列插入[提示]我们可以想在记事本上写下命令,让后复制到数据库客户端,这样可以在出错的时候进行快速修改.同时为了美观和明了,我们可以进行适当…

15个Spring扩展点,一般人知道的不超过5个!

Spring的核心思想就是容器&#xff0c;当容器refresh的时候&#xff0c;外部看上去风平浪静&#xff0c;其实内部则是一片惊涛骇浪&#xff0c;汪洋一片。Spring Boot更是封装了Spring&#xff0c;遵循约定大于配置&#xff0c;加上自动装配的机制。很多时候我们只要引用了一个…

苹果认证MFI学习

MFi是"Made for iPhone/iPod/iPad“的缩写。 MFi包含一系列技术或标准&#xff0c;你所开发的配件&#xff0c;要符合这个标准&#xff0c;才能够苹果设备如手机所认可&#xff0c;才能得到授权在市场销售。 比如蓝牙数据传输&#xff0c;就需要符合iAP2协议&#xff0c…

统计学习方法学习笔记——概论(一)

# 文章内容来自学习李航老师的《统计学习方法》后的总结&#xff0c;相当于学习笔记&#xff0c;若有不正确的地方还请大家指正。# 所需先验知识&#xff1a;概率论与数理统计、线性代数一、 统计学习概述可能有些小伙伴没有听过统计学习&#xff0c;但是我相信机器学习大家一定…

智慧物业管理系统【源码好优多】

简介 《智慧物业》一个免费开源的基于java的物业管理系统。未来将涵盖停车、安保、客服、工单、收费、财务、办公自动化等模块&#xff0c;构建一个软硬件一体的智慧物业解决方案。 功能 系统内置功能&#xff1a; 资产管理 商业区管理、楼栋管理、商铺管理、商铺租售 缴费…

【数电基础】——组合逻辑电路

目录 1.大纲 2.组合逻辑电路的特点 3.组合逻辑电路分析步骤 4.组合逻辑电路设计 5.组合逻辑电路中的竞争和冒险&#xff08;重要&#xff09; 6.怎样消除竞争冒险现象 7.常用的MSI组合逻辑器件 1.加法器 1.一位半加器 2.一位全加器 2.数据选择器 1.二选一数据选择器&#x…

spring容器,@Bean 与 @Component 用在同一个类上,会怎么样?

疑虑背景疑虑描述最近&#xff0c;在进行开发的过程中&#xff0c;发现之前的一个写法&#xff0c;类似如下以我的理解&#xff0c;Configuration 加 Bean 会创建一个 userName 不为 null 的 UserManager 对象&#xff0c;而 Component 也会创建一个 userName 为 null 的 UserM…

第七章 分词器:Text Analysis

1、分词器认知基础 1.1 基本概念 分词器官方称之为文本分析器,顾名思义,是对文本进行分析处理的一种手段,基本处理逻辑为按照预先制定的分词规则,把原始文档分割成若干更小粒度的词项,粒度大小取决于分词器规则。 1.2 分词发生时期 分词器的处理过程发生在 Index Tim…

【牛客刷题专栏】0x0D:JZ5 替换空格(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录前言问题…