4.7 树的实现(上)

news2025/1/21 9:23:30

树(Tree)是n(n≥0)个节点的有限集合T,它满足两个条件 :

有且仅有一个特定的称为根(Root)的节点;

其余的节点可以分为m(m≥0)个互不相交的有限集合T1、T2、……、Tm,其中每一个集合又是

一棵树,并称为其根的子树 表示方法 :树形表示法、目录表示法。

一个节点的子树的个数称为该节点的度数

一棵树的度数是指该树中节点的最大度数。

度数为零的节点称为树叶或终端节点

度数不为零的节点称为分支节点 除根节点外的分支节点称为内部节点

 

一个节点系列k1,k2, ……,ki,ki+1, ……,kj,并满足ki是ki+1的父节点,就称为一条从k1到kj的路径

路径的长度为j-1,即路径中的边数。

路径中前面的节点是后面节点的祖先,后面节点是前面节点的子孙。

节点的层数等于父节点的层数加一,根节点的层数定义为一。

树中节点层数的最大值称为该树的高度或深度。

 

若树中每个节点的各个子树的排列为从左到右,不能交换,即兄弟之间是有序的,则该树称为有序树。

m(m≥0)棵互不相交的树的集合称为森林。

树去掉根节点就成为森林,森林加上一个新的根节点就成为树。

树的逻辑结构 :树中任何节点都可以有零个或多个直接后继节点(子节点),但至多只有一个直

接前趋节点(父节点),根节点没有前趋节点,叶节点没有后继节点。

二叉树

  二叉树是n(n≥0)个节点的有限集合

或者是空集(n=0)

或者是由一个根节点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成

严格区分左孩子和右孩子,即使只有一个子节点也要区分左右。

二叉树的性质

二叉树第i(i≥1)层上的节点最多为2i-1个。

深度为k(k≥1)的二叉树最多有2k-1个节点。

满二叉树 :

深度为k(k≥1)时有2k-1个节点的二叉树。

完全二叉树 :

只有最下面两层有度数小于2的节点,且最下面一层的叶节点集中在最左边的若干位置上。

具有n个节点的完全二叉树的深度为          (log2n)+1或『log2(n+1)。

顺序存储结构 :

完全二叉树节点的编号方法是从上到下,从左到右,根节点为1号节点。设完全二叉树的节点数为n,某节点编号为i

当i>1(不是根节点)时,有父节点,其编号为i/2;

当2*i≤n时,有左孩子,其编号为2*i ,否则没有左孩子,本身是叶节点;

当2*i+1≤n时,有右孩子,其编号为2*i+1 ,否则没有右孩子;

当i为奇数且不为1时,有左兄弟,其编号为i-1,否则没有左兄弟;

当i为偶数且小于n时,有右兄弟,其编号为i+1,否则没有右兄弟;

 有n个节点的完全二叉树可以用有n+1个元素的数组进行顺序存储,

节点号和数组下标一一对应,下标为零的元素不用。

利用以上特性,可以从下标获得节点的逻辑关系。

不完全二叉树通过添加虚节点构成完全二叉树,然后用数组存储,这要浪费一些存储空间。

二叉树链式存储

typedef  int  data_t ;

typedef  struct  node_t;

         {

    data_t data ;

    struct node_t *lchild ,*rchild ;

     } bitree_t ;

     bitree_t *root ;      二叉树由根节点指针决定。

 

二叉树的运算

遍历 :沿某条搜索路径周游二叉树,对树中的每一个节点访问一次且仅访问一次。

二叉树是非线性结构,每个结点有两个后继,则存在如何遍历即按什么样的搜索路径进行遍历的问题。

二叉树的遍历

由于二叉树的递归性质,遍历算法也是递归的。三种基本的遍历算法如下 :

先访问树根,再访问左子树,最后访问右子树;

先访问左子树,再访问树根,最后访问右子树;

先访问左子树,再访问右子树,最后访问树根;

先序遍历算法

若二叉树为空树,则空操作;否则

访问根结点

先序遍历左子树

先序遍历右子树

先序遍历算法

void  PREORDER ( bitree *r) {

    if ( r = = NULL ) return ;     //空树返回

    printf ( “ %c ”,r->data );       //先访问当前结点

    PREORDER( r->lchild );     //再访问该结点的左子树

    PREORDER( r->rchild );     //最后访问该结点右子树

}

 

中序遍历算法

若二叉树为空树,则空操作;否则

中序遍历左子树

访问根结点

中序遍历右子树

    中序遍历算法

void  INORDER ( bitree *r) {

    if ( r = = NULL ) return ;   //空树返回

    INORDER( r->lchild );     //先访问该结点的左子树

    printf ( “ %c ”,r->data );    //再访问当前结点

    INORDER( r->rchild );     //最后访问该结点右子树

}

后序遍历算法

若二叉树为空树,则空操作;否则

后序遍历左子树

后序遍历右子树

访问根结点

     后序遍历算法

void  POSTORDER ( bitree *r) {

    if ( r = = NULL ) return ;     //空树返回

    POSTORDER( r->lchild );   //先访问该结点的左子树

    POSTORDER( r->rchild );  //再访问该结点右子树

    printf ( “ %c ”,r->data );       //最后访问当前结点

}

二叉树的遍历

遍历的路径相同,均为从根节点出发,逆时针沿二叉树的外缘移动,每个节点均经过三次。按不同的次序访问可得不同的访问系列,每个节点有它的逻辑前趋(父节点)和逻辑后继(子节点),也有它的遍历前趋和遍历后继(要指明遍历方式)。

按编号遍历算法 :

    NOORDER  ( bitree *r)         /*按编号顺序遍历算法*/

{

           int  front,  rear;

           bitree  *Q[N];

if ( r == NULL ) return ;         /*空树返回*/

for (rear=1;rear<N; rear++) Q[rear] = NULL ;

front = rear = 1;  Q[rear] = r;

while ( Q[front] != NULL ) {    /*以下部分算法由学生完成设计*/

         /*访问当前出队节点*/

         /*若左孩子存在则左孩子入队*/

         /*若有孩子存在则右孩子入队*/

         /* front向后移动*/

}  }

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

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

相关文章

电子企业WMS仓储管理系统解决方案

随着科技的飞速发展&#xff0c;电子制造行业对仓储管理系统的需求也越来越高。电子企业需要一种能够规划、执行和优化仓库货物流通的IT解决方案&#xff0c;以实现自动化操作和提高效率。本文将探讨电子企业WMS仓储管理系统解决方案&#xff0c;从需求分析、系统设计、实施与运…

在Windows系统中安装Wireshark(图文)

1.打开Wireshark官网后&#xff0c;点Get Acquainted->Download后进入到下载界面&#xff0c;在Stable Release中选择下载Windows 64位的安装包&#xff0c;单击Windows Installer(64-bit) 下载。 2.双击下载的安装包&#xff0c;如下图&#xff0c;点击Next。 3.点Noted&am…

ELK的安装部署与使用

ELK的安装与使用 安装部署 部署环境&#xff1a;Elasticsearch-7.17.3 Logstash-7.17.3 Kibana-7.17.3 一、安装部署Elasticsearch 解压目录&#xff0c;进入conf目录下编辑elasticsearch.yml文件&#xff0c;输入以下内容并保存 network.host: 127.0.0.1 http.port: 9200…

基于相似加权自组装框架的低质量少样本MRI脑卒中病变分割

文章目录 Stroke Lesion Segmentation from Low-Quality and Few-Shot MRIs via Similarity-Weighted Self-ensembling Framework摘要本文方法Soft Distribution-aware Updating (SDU) 实验结果 Stroke Lesion Segmentation from Low-Quality and Few-Shot MRIs via Similarity…

蓝桥杯模块学习5——按键

第一章 硬件部分 1.1 电路的组成部分 1.1.1 按键电路 原理图&#xff1a; 功能&#xff1a; &#xff08;1&#xff09; J5&#xff1a;当1和2相接&#xff0c;电路就变成一个4*4的矩阵键盘电路&#xff1b;当2和3相接时&#xff0c;电路变成了一个S4-S7的独立按键&#xf…

平板触控笔要原装的吗?苹果平替笔性价比高的推荐

与苹果的电容笔不同&#xff0c;市场上的电容笔只会给人一种倾斜的压感&#xff0c;并不会像苹果的电容笔那样&#xff0c;可以给人一种重力的压感。不过&#xff0c;如果你不一定要画画&#xff0c;那你就不用花很多钱去买一支苹果的原装电容笔了&#xff0c;只需一支平替电容…

ss命令使用详解

ss是Socket Statistics的缩写。顾名思义&#xff0c;ss命令可以用来获取socket统计信息&#xff0c;它可以显示和netstat类似的内容。ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息&#xff0c;而且比netstat更快速更高效。 当服务器的socket连接数量变得非常大…

从小白到专家:如何在营销中利用 AI 的力量

欢迎来到营销的未来&#xff0c;时至今日人工智能和人类专业知识以前所未有的方式结合在一起。 认识ChatGPT&#xff0c;这是改变游戏规则的革命性工具。 借助ChatGPT&#xff0c;你最终将能够利用AI的力量做出明智的、数据驱动的决策来满足你的受众需求。 但ChatGPT不仅仅是…

[高光谱]高光谱数据的获取与展示

一、环境准备 需要安装spectral包&#xff0c;这个包专门用于高光谱数据展示。 pip install spectral 二、数据加载 要预先准备原始高光谱的.mat数据和分类数据gt.mat(ground-turth)&#xff1b;然后使用scipy.io中的loadmat(.)将其读入程序。 from scipy.io import loadmat…

JCJC句子改写在线工具上线-202305

JCJC句子改写在线工具上线-202305 字根科技发布了新版JCJC在线句子改写功能。 使用网址&#xff1a; JCJC在线句子改写 新版的在线中文句子改写一共分为三种模式&#xff1a; 严谨模式普通模式休闲模式 上述三种改写模式适用于不同的改写需求&#xff0c;界面展示如下&…

springboot读取和写入csv文件数据

前言 csv格式的表格&#xff0c;和xls以及xlsx格式的表格有一些不同&#xff0c;不能够直接用处理xls的方式处理csv&#xff1b; 以下我将介绍如何读取并写入csv数据 准备工作 要处理csv格式的表格数据&#xff0c;我们首先需要引入pom.xml的依赖 <dependency><art…

Linux如何实现动态IP

Linux系统可以通过DHCP&#xff08;动态主机配置协议&#xff09;来实现动态IP。DHCP是一种自动分配IP地址的协议&#xff0c;它可以自动为网络中的设备分配IP地址、子网掩码、网关等网络参数&#xff0c;从而实现动态IP。 在Linux系统中&#xff0c;可以使用DHCP客户端工具来…

分享个常用的跨境电商数据分析平台

在跨境电商人眼中&#xff0c;适合用在跨境电商数据分析上的大数据分析平台该是怎样的&#xff1f;是效率高、财务指标计算快、业务能随时自助分析&#xff0c;最好是能将平台自身的分析经验分享给跨境电商企业&#xff0c;为企业提供更专业的服务。这样的大数据分析平台虽然少…

【Prometheus】实战Prometheus部署

目录 架构安装部署Exporters 架构 Prometheus的基本原理是通过HTTP周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口并符合Prometheus定义的数据格式&#xff0c;就可以介入Prometheus监控 Prometheus Server负载定时在目标上抓取metrics(指标)数据&…

chatgpt-最常报错Access denied

一、问题 Access denied 的原因基本都是由于 IP 地址&#xff0c;例如我们用国内网络直接访问 ChatGPT 官网就会报错 Access denied&#xff08;访问被拒绝&#xff09;&#xff0c;Error reference number 1020&#xff08;错误参考编号&#xff1a;1020&#xff09; 二、原因…

Nginx(一)---Nginx下载及安装

一.初识Nginx Nginx 是一个功能强大的 Web 服务器和反向代理服务器。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力确实在同类型的网页服务器中表现较好&#xff0c;中国大陆使用nginx网站用户有&#xff1a;百度、京东、新浪、网易、腾讯、淘宝…

在Windows中如何使用工具恢复已删除的文件?

​当你的电脑遇到任何类型的数据丢失问题时&#xff0c;傲梅恢复之星都会帮助你。你可以在Windows 11/10/8/7中快速轻松的从HDD/SSD恢复丢失或删除的数据。 傲梅恢复之星功能 易于使用&#xff1a;你可以通过3个简单易行的步骤轻松恢复丢失的数据。 适合多种数据丢失情况&a…

787. K 站中转内最便宜的航班

有 n 个城市通过一些航班连接。给你一个数组 flights &#xff0c;其中 flights[i] [fromi, toi, pricei] &#xff0c;表示该航班都从城市 fromi 开始&#xff0c;以价格 pricei 抵达 toi。 现在给定所有的城市和航班&#xff0c;以及出发城市 src 和目的地 dst&#xff0c;…

LPP 和 Kernel LPP

无监督度量学习的降维讲义:LPP Lecture notes in dimensionality reduction for unsupervised metric learning: LPPLECTURE 6: LOCALITY PRESERVING PROJECTIONS AND KERNEL LPP A. Kernel LPP Lecture notes in dimensionality reduction for unsupervised metric learning: …

DHCP数据包分析

目录 1、DHCP 2、DHCP报文种类 3、DHCP工作原理 4、DHCP报文格式 1、DHCP DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;&#xff0c;前身是BOOTP协议&#xff0c;是一个局域网的网络协议&#xff0c;使用UDP协议工作&am…