【数据结构】树与二叉树

news2024/11/17 11:21:39

目录

树的定义

二叉树的定义

二叉树的性质

满二叉树

完全二叉树

二叉树的存储结构

顺序存储结构

链式存储结构

遍历二叉树(递归)

二叉树的层次遍历

先序创建二叉树

复制二叉树

销毁二叉树

写在最后


树的定义

树是n个结点的有限集(n>=0)

若n=0,则称为空树

若n>0,则满足如下条件:

  1. 有且仅有一个特定的结点,称为根
  2. 其余结点可分为m个互不相交的有限集T1,T2,T3...Tm(m>=0),其中每个集合本身又是一棵树,称为根的子树

树的一些基本术语
根结点非空树中没有前驱结点的结点,例如A
结点的度结点拥有的子树的个数,例如:A的度为3,B的度为2,H的度为0
叶子/终端结点结点的度等于0,例如:K,L,H
分支/非终端结点结点的度不等于0,例如:D
树的度树内个结点的最大值,例如图示,树的度为3
树的深度把上图的结点每一行记为一层,树的深度就是层数的最大值,在本例中就是4

二叉树的定义

二叉树是n(n>=0)个结点的有限集,不是树的特殊情况,两者是两个概念

  1. 当n等于0时是空集;
  2. 当n不等于0时,由一个根结点以及两个互不相交的左子树、右子树组成。

如果二叉树有三个结点,则用二叉树和普通树分别表示为:

 

二叉树的性质

  1. i 层中最多有 2^{i-1} 个结点,至少有 1 个结点。
  2. 深度为K的二叉树至多有 2^{k}-1 个结点,至少有 k 个结点。
  3. 对于一棵二叉树,叶子树为 n_{0} ,度为2 的结点数为 n_{2} ,那么 n_{0}=n_{2}+1

满二叉树

性质:

  1. 每一层的结点都是满的;
  2. 叶子结点均在最底层;
  3. 每个结点位置均有元素;
  4. 编号规则:自上而下,自左而右;

完全二叉树

具有n个结点的完全二叉树的深度为[\log_{2}n]+1( [x]表示不大于x的最大整数),在一个满二叉树中,从最后一个结点开始,连续去掉任意个结点,即是一个完全二叉树。

性质:

如果对一棵有n个结点的完全二叉树,则对任一结点i(1<=i<=n)有:

  1. 双亲结点:如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则双亲结点为 [ \frac{i}{2}];(向下取整)
  2. 左孩子:如果2i>n,则结点i为叶子结点;否则,其左孩子结点为2i;
  3. 右孩子:如果2i+1>n,则结点i无右孩子;否则,其右孩子是结点2i+1;

二叉树的存储结构

顺序存储结构

缺点:会出现最坏的情况,深度为k的且只有k个结点的单只树需要长度为2^{k}-1的一维数组,空间浪费严重,比较适合满二叉树,和完全二叉树的情况

 

链式存储结构

头文件

#include "Queue.h"
#include "Stack.h"
#include "define.h"
#ifndef __BINARYTREE_H
#define __BINARYTREE_H
typedef char BitreeElemType;
typedef struct __BiNode 
{
   BitreeElemType data;
   __BiNode *lchild, *rchild;
}BiNode, *BiTree;

void InOrder(BiTree T);
void PreOrder(BiTree T);
void PostOrder(BiTree T);
void LevelOrer(BiTree T);
void Copy(BiTree *Tnew, const BiTree T);
void Destroy(BiTree *root);
#endif

二叉链表

typedef char ElemType;
typedef struct BiNode 
{
   ElemType data;
   struct BiNode *lchild, *rchild;//左孩子,右孩子指针
} BiNode, *BiTree;

遍历二叉树(递归)

先序遍历中序遍历后序遍历
若二叉树为空,则空操作

访问根节点;

先序遍历左子树;

先序遍历右子树;

中序遍历左子树;

访问根节点;

中序遍历右子树;

后序遍历左子树;

后序遍历右子树;

访问根节点;

遍历二叉表的三种方法

  • 先序遍历结果(根左右):A  B  D  G  C  E  H  F
  • 中序遍历结果(左根右):D  G  B  A  E  H  C  F
  • 后序遍历结果(左右根):G  D  B  H  E  F  C  A
void InOrder(BiTree T)//中序 
{
   if (!T)
   return;
   InOrder(T->lchild);
   printf("%c ", T->data);
   InOrder(T->rchild);
}
void PreOrder(BiTree T) //先序
{
   if (!T)
   return;
   printf("%c ", T->data);
   PreOrder(T->lchild);
   PreOrder(T->rchild);
}
void PostOrder(BiTree T) //后序
{
   if (!T)
   return;
   PostOrder(T->lchild);
   PostOrder(T->rchild);
   printf("%c ", T->data);
}

二叉树的层次遍历

使用队列(易理解):

  1. 将根结点进队
  2. 队不空时循环:从队列中出列一个结点*p访问它:                                                                            若它有左孩子,则将左孩子结点进队;                                                                                      若它有右孩子,则将右孩子结点进队;
void LevelOrer(BiTree T)
{
   BiTree temp = NULL;
   SqQueue Q;
   InitQueue(&Q);
   if (T) // 先入队根
      EntryQ(&Q, T);
   while (!IsEmpty(&Q))
   {
      OutQ(&Q, &temp); // temp暂存弹出值
      printf("%c", temp->data); //输出
      if (temp->lchild) //在入队temp的左孩子和右孩子
      EntryQ(&Q, temp->lchild);
      if (temp->rchild)
      EntryQ(&Q, temp->rchild);
   }
}

先序创建二叉树

void Creat_BiTree_Pre(BiTree *T)
{
   //根据输出字符识别虚空节点,'#' 代表虚空节点
   char e;
   scanf(" %c", &e); //输入字符
   if ( e== '#')
      *T = NULL; //设置虚空节点
   else 
   {
      *T = (BiTree)malloc(sizeof(BiNode));
      (*T)->data = e;   //生成根结点
      Creat_BiTree_Pre(&(*T)->lchild);//构造左子树
      Creat_BiTree_Pre(&(*T)->rchild);//构造右子树
   }
}

复制二叉树

如果,是空树,递归结束;

否则,复制新结点空间,复制根结点:

  •       递归复制左子树
  •       递归复制右子树
void Copy(BiTree *Tnew, const BiTree T) 
{
   if (!T)//如果是空树则返回
   {
      *Tnew = NULL;
      return;
   }
   else 
   {
      *Tnew = (BiTree)malloc(sizeof(BiNode));
      (*Tnew)->data = T->data;
      Copy(&(*Tnew)->lchild, T->lchild);
      Copy(&(*Tnew)->rchild, T->rchild);
   }
}

销毁二叉树

//递归的方式
void Destroy(BiTree *root)
{
   //销毁操作必须按照后续遍历的顺序
   if (!(*root))
     return;
   else 
   {
      Destroy(&(*root)->lchild);
      Destroy(&(*root)->rchild);
      free(*root);
      *root = NULL;
   }
}

写在最后

👍🏻点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论,你的意见是我进步的财富!

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

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

相关文章

微信小程序中生成普通二维码,并根据二维码里的参数跳转对应的页面

微信小程序中生成普通二维码&#xff0c;并根据二维码里的参数跳转对应的页面1.打开[微信公众平台](https://mp.weixin.qq.com/)使用encodeURIComponent()对参数进行转码第一步&#xff1a;对要传递的参数进行编码第二步&#xff1a;生成二维码第三步&#xff1a;小程序中转页面…

电子元器件B2B电商平台建设方案:优化企业商流,拓宽B2B交易渠道

随着5G、汽车电子、物联网等新兴产业的发展&#xff0c;促进了相关电子元器件的市场需求快速增长。根据工信部预计&#xff0c;2023年我国电子元器件销售总额将达到2.1万亿元。而在互联网高速发展的今天&#xff0c;电子元器件交易在线化是必然趋势&#xff0c;B2B电子元器件线…

maven学习:引入

你是否早已厌倦了日复一日的手工构建工作&#xff1f;你是否对各个项目风格迥异的构建系统感到恐惧&#xff1f;Maven——Maven 的正确发音是[ˈmevən]&#xff0c;而不是“马瘟”以及其他什么瘟。Maven 在美国是一个口语化的词语&#xff0c;代表专家、内行的意思。这一Java社…

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。 假设要预测其中一个变量。比如&#xff0c;sparkling wine。如何建立一个模型来进行预测呢&#xff1f; 一种常见的方法是将该变量其视为单变量时间序列。这样就有很多方法可以…

【从零开始学微服务】04.微服务架构的特点

大家好&#xff0c;欢迎来到万猫学社&#xff0c;跟我一起学&#xff0c;你也能成为微服务专家。 微服务架构被技术大牛们总结出了以下九个特点&#xff1a; 服务组件化围绕业务功能产品而不是项目强终端弱管道去中心化管理去中心化数据管理基础设施自动化容错性设计演进式设计…

Python 快速入门

文章目录Python 快速入门1 环境配置1.1 简介1.2 Python 安装1.3 其余软件1.4 编辑器的使用2 基础语法2.1 特点2.2 代码块2.3 注释3 数据类型3.1 变量类型3.2 数据结构3.3 运算符3.3.1 逻辑运算符3.3.2 比较运算符3.3.3 算术运算符3.3.4 布尔运算符4 流程语句4.1 循环语句4.1.1 …

Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)

需要全部源码或运行有问题请点赞关注收藏后评论区留言~~~ 一、通过okhttp调用HTTP接口 尽管使用HttpURLConnection能够实现大多数的网络访问操作&#xff0c;但是操作过于繁琐&#xff0c;于是Andorid从9.0是使用okhttp这个框架 由于okhttp属于第三方框架 所以使用前要修改模…

我们的程序是如何跑起来的?

1.我们写的代码写完并测试以后是如何部署给用户使用的? 1. 准备所需要的服务器 2. 在服务器上安装JDK、mysql、redis、Tomcat、Nginx等环境 3. 进行mysql、redis、nginx的连接配置 4. 项目打包。前端构建打包成功后在根目录dist文件夹中&#xff1b;后端打成jar包&#xff0c…

基于改进海洋捕食者算法求解单目标优化问题附matlab代码(NMPA)

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

VLAN网络支持ipv6的交换机和虚机配置

VLAN支持ipv6的交换机和虚机配置前言一、创建VLAN网络并配置交换机1.规划并在OpenStack上创建 VLAN网络2.在交换机上配置VLAN二、Ubuntu虚机配置1.创建虚机2.在OpenStack上查看port3.登录虚机配置网卡3.1登录虚机后&#xff0c;发现虚机没获取到openstack上对应port的ipv6地址。…

Qt编写跨平台视频监控系统(64通道占用7%CPU/支持win_linux_mac等)

一、前言 视频监控组件经历过数十年的迭代&#xff0c;从最初的只简单播放个rtsp视频流&#xff0c;到现在支持各种音频视频文件格式&#xff08;mp3、wav、mp4、asf、rm、rmvb、mkv等&#xff09;、支持各种视频流格式&#xff08;rtp、rtsp、rtmp、http等&#xff09;、支持…

10个JavaScript常见高级知识点

今天&#xff0c;给大家分享的是一篇干货知识《10个JavaScript常见高级知识点》&#xff0c;主要针对初级前端和想要面试找工作的同学&#xff0c;想要学好前端&#xff0c;除了要掌握JavaScript的基础知识外&#xff0c;还需要掌握一些高级的知识点。 学会了下面这些常见的高…

鼠标经过图片在边框内放大动效

鼠标没有经过&#xff1a; 鼠标经过的时候&#xff0c;看图&#xff0c;应该可以看出变化吧&#xff01;图有放大的效果。 样式&#xff1a;图片由一个盒子包着&#xff0c;盒子加上overflow:hidden的样式&#xff0c;即可以保证图片在边框内放大。 然后给图片加上动画效果就可…

JavaWeb开发之——数据库设计(20)

一 概述 数据库设计-简介数据库设计-多表关系实现数据库设计-案例 二 数据库设计-简介 2.1 软件的研发步骤 2.2 数据库设计概念 数据库设计就是根据业务系统的具体需求&#xff0c;结合我们所选用的DBMS(Database Management System-数据库管理系统)&#xff0c;为这个业务系…

运动哪种耳机好用,推荐五款适合运动的耳机分享

​经常佩戴耳机的小伙伴都知晓传统的蓝牙耳机相对于有线耳机来说比较方便&#xff0c;但也存在着耳道一直堵塞导致细菌的滋生等因素的存在&#xff0c;但在近些年火热的骨传导耳机却能够将这些问题一一化解&#xff0c;基本可以说是百利而无一害&#xff0c;所以今天我就给小伙…

第一章 计算机系统体系结构

1.1 什么是计算机体系结构 本章的第一个概念是计算机系统(computer system)。 计算机系统包括读取并执行程序的 中央处理单元(CPU&#xff0c; 保存程序和数据的存储器以及将芯片转换为实用系统的 其他子系统。 这些子系统会使CPU与显示器、打印机、Internet等外部设备之间的…

【优化求解】整数规划求解机票超售优化赔付问题【含Matlab源码 2182期】

⛄一、问题 A航空公司每天有6班航班从上海到北京&#xff0c;从上午10点到晚上8点&#xff0c;每两小时发一班航班。某天获知&#xff0c;前三班机每班可以容纳100名旅客&#xff0c;后三班机每班可以容纳150名旅客。如果某次航班超售&#xff0c;A航空公司可以把某预定了该次…

【JSP/Servlet】基于WEB的通讯录系统

巩固JSP/Servlet系统开发描述步骤系统功能描述一、创建一个登录页面二、模拟数据&#xff08;用数据库模拟用户名和密码还有用户的通讯录&#xff09;三、创建一个JDBC工具类四、判断在登录页面输入的用户名和密码是否正确五、利用cookie实现保存六、以表格形式显示出我的通讯录…

2022最新MySQL面试题-有详细完整的答案解析

MySQL专题面试题 MySQL中有哪些存储引擎&#xff1f; InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎&#xff0c;也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务&#xff0c;应该优先考虑InnoDB引擎。 MylSAM存储引擎 在MySQL 5.1及之前的…

操作简单的BI数据分析软件有哪些?实际体验如何?

使用者没有IT基础&#xff0c;不懂代码&#xff0c;又需要对大量复杂的数据进行深度分析&#xff1b;分析效率要高&#xff1b;报表要直观易理解&#xff1b;最好能让每个浏览者都自己动手做分析。现在市面上&#xff0c;能够满足这些要求的BI数据分析软件有哪些&#xff1f;实…