【数据结构(四)】树

news/2024/4/25 6:40:55/文章来源:https://blog.csdn.net/K3169/article/details/128864459

文章目录

    • 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 100struct 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.luyixian.cn/news_show_75600.aspx

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

相关文章

敏捷-期末

什么是敏捷开发&#xff1f; 敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。 怎么理解呢&#xff1f;它不是一门技术&#xff0c;它是一种开发方法&#xff0c;也就是一种软件开发的流程&#xff0c;它会指导我们用规定的环节去一步一步完成项目的开…

二叉树路径查找

题目描述&#xff1a;给定一棵二叉树(结构如下)&#xff0c;其中每个节点值为整数。给定一个值 K&#xff0c;求所有满足如下条件的路径并将路径上节点的值打印出来&#xff1a; 1、路径方向必须向下&#xff0c;即只能从父节点指向子节点 2、路径并不是必须从根节点开始或在叶…

一起玩转开源数据库!OceanBase DevCon 之开源生态全景解析

​ 2023 年 3 月 25 日&#xff0c;首次 OceanBase 开发者大会将在北京举办&#xff0c;OceanBase 首席科学家阳振坤与 OceanBase CTO 杨传辉领携众多技术专家&#xff0c;将与开发者共同探讨单机分布式、云原生、HTAP 等数据库前沿趋势&#xff0c;OceanBase 开源技术全景生…

【安卓】安卓设备实现wifi display解决方案

看文章前&#xff0c;我们需要知道的几个概念&#xff1a; 1、Wifi Direct技术&#xff1b; 2、Wifi Display技术&#xff1b; 3、Miracast标准&#xff1b; 安卓手机用户都知道我们的安卓手机有一个wifi直连功能&#xff0c;在点击设置–》WIFI–》更多Wifi设置–》Wifi直连&a…

【Linux】操作系统与Linux — Linux概述、组成及目录结构

目录 一、什么是操作系统&#xff1f;都有那些&#xff1f; 二、Linux概述 三、Linux组成 三、Linux目录结构 四、Linux目录结构 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、什么是操作系统&#xff1f;都有那些&#x…

Linux | 1. 挂载新硬盘与磁盘管理

如有错误&#xff0c;恳请指出。 1. Ubuntu挂载新硬盘 查看磁盘状态&#xff1a;sudo fdisk -l 1&#xff09;为新硬盘分区 使用 fdisk 指令对 /dev/sdb 进行分区操作&#xff1a;sudo fdisk /dev/sdb。进入分区工具后&#xff0c;我们可以输入 m 看指令说明&#xff0c;注意…

SQL数据库权限管理-10个数据库角色

为便于管理数据库中的权限&#xff0c;SQL 数据库提供了服务器角色、数据库角色、用户等来划分不同用户拥有的权限差异。今天给大家介绍数据库角色对应的权限。 数据库级角色 存在两种类型的数据库级角色&#xff1a; 数据库中预定义的“固定数据库角色”可以创建的“用户定…

New Bing怼人、说谎、PUA,ChatGPT已经开始胡言乱语了

最近&#xff0c;来自大洋彼岸那头的ChatGPT科技浪潮席卷而来&#xff0c;微软将chatGPT整合搜索引擎Bing开启内测后&#xff0c;数百万用户蜂拥而至&#xff0c;都想试试这个「百事通」。 赶鸭子上架&#xff0c;“翻车”了&#xff1f; 但短短上线十几天&#xff0c;嵌入了…

架构篇之如何画出优秀的架构图(二)

今天是架构篇的第二篇文章,跟大家聊聊如何画出好的架构图。 一、架构图分类 1、业务架构 a. 定义:描述系统对用户提供了什么业务功能。 b. 使用场景: 产品规划业务给高P汇报

高通平台开发系列讲解(Sensor篇)AlsPs的工作原理及介绍

文章目录 一、什么是ALS?二、什么是距感(PS)?三、AlsPs的工作原理四、AlsPs的特性五、距感的校准参数说明六、光感的校准参数说明沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍 AlsPs 的工作原理及介绍。 一、什么是ALS? 光感的英文叫做Ambient Li…

大数据|Hadoop系统

目录 &#x1f4da;Hadoop介绍 &#x1f4da;Hadoop优点 &#x1f4da;Hadoop的体系结构 &#x1f430;HDFS的体系结构 &#x1f430;MapReduce的体系结构 &#x1f430;HDFS和MapReduce的协同作用 &#x1f4da;Hadoop与分布式开发 &#x1f430;MapReduce计算模型 &a…

时钟振荡器的作用

引言 如果电子元件没有时钟&#xff0c;你怎么知道你的信号的频率是多少&#xff1f;频率的定义是一秒振荡的次数。一秒是多久&#xff1f;那么为了知道一秒是多久&#xff0c;电子元件的时钟就很重要了&#xff0c;我们通过频率准确的晶振来产生振荡信号。因为晶振的频率是固…

网络安全从入门到精通:30天速成教程到底有多狠?你能坚持下来么?

毫无疑问&#xff0c;网络安全是当下最具潜力的编程方向之一。对于许多未曾涉足计算机编程的领域「小白」来说&#xff0c;深入地掌握网络安全看似是一件十分困难的事。至于一个月能不能学会网络安全&#xff0c;这个要看个人&#xff0c;对于时间管理不是很高的&#xff0c;肯…

信贷系统学习总结(5)—— 简单的风控示例(含代码)

一、背景1.为什么要做风控?目前我们业务有使用到非常多的AI能力,如ocr识别、语音测评等,这些能力往往都比较费钱或者费资源,所以在产品层面也希望我们对用户的能力使用次数做一定的限制,因此风控是必须的!2.为什么要自己写风控?那么多开源的风控组件,为什么还要写呢?是不是想…

2023上半年北京/上海/广州/深圳NPDP产品经理认证报名

产品经理国际资格认证NPDP是国际公认的唯一的新产品开发专业认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年…

已解决The above exception was the direct cause of the following exception:

已解决RuntimeError: module compiled against API version 0xe but this version of numpy is 0xd ImportError: numpy.core.multiarray failed to import The above exception was the direct cause of the following exception: SystemError: returned a result with an err…

HU4056H耐压高达28V,具有电源OVP功能的1A单节锂离子电池线性充电IC

产品概述 HU4056H是一款完整的采用恒定电流/恒定电压的高压、大电流、单节锂离子电池线性充电 IC。最高耐压可达 28V&#xff0c; 6.5V 自动过压保护&#xff0c;充电电流可达 1A。 由于采用了内部 PMOSFET 架构&#xff0c;加上防倒充电路&#xff0c;所以不需要外部隔离二…

你问我答|虚拟机、容器和无服务器,怎么选?

在新技术层出不穷的当下,每家企业都希望不断降低成本,并提高运营效率,一个方法就是寻找不同的技术方案来优化运营。      例如,曾经一台服务器只能运行一个应用(裸机);接着,一台服务器的资源可以划分为多个块,从而运行多个应用(虚拟化);再到后来,应用越来越多,为了方便它们…

移动字母--降维与DFS

一、题目描述 2x3=6 个方格中放入 ABCDE 五个字母,右下角的那个格空着。如下图所示。 和空格子相邻的格子中的字母可以移动到空格中,比如,图中的 C 和 E 就可以移动,移动后的局面分别是: A B D E C A B C D E 为了表示方便,我们把 6 个格子中字母配置用一个串表示出…

老字号白酒企业——金徽酒借力泛微,升级门户,实现统一办公

金徽酒股份有限公司前身系康庆坊、万盛魁等多个徽酒老作坊基础上组建的省属国营大型白酒企业&#xff0c;曾用名甘肃陇南春酒厂&#xff0c;是国内建厂最早的中华老字号白酒酿造企业之一。2016年3月10日&#xff0c;金徽酒在上海证券交易所挂牌上市。 &#xff08;图片素材来自…