【数据结构】树和二叉树的定义 |二叉树的基本特点和性质 |存储与遍历 |递归

news2024/11/18 13:38:31

专栏文章:数据结构学习笔记
作者主页:格乐斯

前言

树和二叉树的定义
二叉树的基本特点和性质
二叉树的存储与遍历

树的定义

  1. 树是n(n>=0)个结点的有限集合;

    若n=0,称为空树;

    若n>0,称为非空树,非空树有且仅有一个结点被称为根;

  2. 除根结点以外的结点可分为m(m>0)个互不相交的有限集,其中每个集合本身也是一棵树,称为根的子树。

  3. 树的定义也涉及到树,某种程度上这体现了递归的思想;实际上对树进行遍历也使用了递归算法

树的基本术语

  • 根结点:非空树中无前驱结点的结点
  • 结点的度:结点拥有的子树数量
  • 非终端结点或分支结点:度不等于0
  • 叶子或终端结点:度等于0
  • 兄弟结点:前驱结点为同一结点的结点
  • 堂兄弟结点:在同一层的结点
  • 双亲结点:孩子结点的前驱结点
  • 孩子结点:双亲结点的后继结点
  • 树的度:各结点的度的最大值
  • 树的深度:树中结点的最大层次
  • 有序树:结点各子树从左至右有序,不能互换(左优先)
  • 无序树:结点各子树可互换位置
  • 森林:n棵互不相交的树的集合;树是只有一棵树的森林;森林不一定是树

二叉树的定义

二叉树是特殊的树,对于非空二叉树:除根结点以外的结点分为两个互不相交子集,分别称为左子树和右子树,而它们本身又是二叉树

简而言之,二叉树的结点最多只能有两个子树

二叉树基本特点

  • 结点的度不超过2
  • 有序树

完全二叉树

只有最后一层的结点有可能不满,且结点全部集中在左边

满二叉树

深度为k,且有(2^k) -1个结点的二叉树;

特点:每层结点都满;叶子结点全部在最底层;每一结点位置都有元素;满二叉树是完全二叉树的特例

二叉树性质

性质1

二叉树的第i层上至多有2^(i-1)个结点(i>=1)

**证明:**假设该二叉树是满二叉树

第一层只有1个结点,也就是根结点:2^(1-1)=1

第二层有2个结点:2^(2-1)=2

第三层有4个结点:2^(3-1)=4

根据归纳法可得:第i层有2^(i-1)个结点

性质2

深度为k的二叉树至多有(2^k) -1个结点(k>=1)

证明:对性质1的公式进行等比数列求和可得结果

性质3

对于任何一棵二叉树,假设终端结点(度为0)数为n0,度为1的结点数为n1,度为2的结点数为n2,则n0=n2-1

证明:总结点数 n=n1+n2+n0 ;

n1下接一条边,n2下接两条边, 则2*n2+n1=n-1;

两式相减得n0-n2=1

性质4

具有n个结点的完全二叉树深度为[log2(n+1)] 或 [log2n]+1 (中括号[ ] 意为向下取整)

证明:完全二叉树的结点数n一定少于等于相同深度的满二叉树的结点数(2^k) -1,即n<=(2^k) -1,可得k=[log2(n+1)]

性质5

对于一个有n个结点的完全二叉树,从上至下、从左至右对结点进行编号,则编号为i的结点,有以下几种情况:

1、若2i>n,则结点i为叶子结点,无左孩子;否则左孩子结点为2i

2、若2i+1>n,则结点i无右孩子;否则右孩子结点为2i+1

3、若i=1,则结点i为二叉树的根结点,无双亲;若

i>1,则双亲为 [i/2] (结果向下取整)

二叉树的存储与遍历

二叉树的存储

二叉树的顺序存储

按满二叉树的结点层次编号,依次存放二叉树中的数据元素;一般使用数组存储数据元素。

在这里插入图片描述

typedef struct
{
    TElemType *data;
    int length;
    int NumberofNodes;
}BiTree;
BiTree BT;

bool InitBinaryTree(BiTree &BT)
{
    BT.numberofnodes=8;
    BT.data=new TElemType[NumberofNodes];
    if(!BT) return false;
    BT.length=0;
    return true;
}

特点:

结点间关系蕴含在其存储位置中

缺点是存储普通二叉树浪费空间,尤其是单支树;非常适用于存储满二叉树和完全二叉树,两者空间利用率都是百分百

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


二叉树的链式存储

  1. 二叉链表
    在这里插入图片描述

    typedef struct BiNode
    {
        TElemType data;
        struct BiNode *left,*right;  //左孩子和右孩子指针    
    }BiNode,*BiTree;
    
  2. 三叉链表

    在这里插入图片描述

    typedef struct TriNode
    {
        TElemType data;
        struct TriNode *left,*right,*parent;
    }TriNode,*TriTree;
    

二叉树的遍历

遍历(Traversal),是指沿着某条搜索,依次对树(或图)中每个结点均做一次访问。

遍历是二叉树插入、删除、修改、查找和排序操作的前提、基础和核心。

二叉树的遍历方式分为三种

  • DLR 先序遍历,即先根再左再右
  • LDR 中序遍历,即先左再根再右
  • LRD 后序遍历,即左根再右再根

tips:先中后都指的是根节点在遍历中的位置

在这里插入图片描述

如上图二叉树,三种遍历方式的路径:

先序:A->B->D->C->E->G->F

中序:D->B->A->E->G->C->F

后序:D->B->G->E->F->C->A


遍历算法的实现

  1. 先序遍历每个结点并打印以当前结点为根结点的二叉树
//先序遍历
bool PreOrderTraverse(BiTree T)
{
    if(T==NULL) return true;  //遍历到空结点终止递进,开始回归
    print(T);  //打印以T为根结点的二叉树
    PreOrderTraverse(T->left);   //左子树递归
    PreOrderTraverse(T->right);  //右子树递归
}

二叉树递归灵魂三问:

  • 找到整个递归的终止条件,递归在什么时候结束?
  • 求返回值,应该给上一级返回什么信息?
  • 本级递归应该做什么?

  1. 求出二叉树的最大深度
int deepth(TreeNode *root)
{
    if(root==NULL) return 0;  //空结点终止递进
    int left=deepth(root->left);  //遍历左子树并求其深度
    int right=deepth(root->right);//遍历右子树并求其深度
    return 1+Max(left,right); //返回本级二叉树的深度
}

  1. 二叉树叶子结点的个数
int LeadCount(BiTree T)
{
    //空树返回0
    if(T==NULL) return 0;
    //叶子结点返回1
    if(T->left==NULL && T->right==NULL) return 1;
    //否则返回本级二叉树的叶子结点个数
    return LeadCount(T->left) s+ LeadCount(T=>right);
}

总结

本文主要介绍了以下几点:

  • 树和二叉树的定义
  • 二叉树的基本特点和性质
  • 二叉树的存储与遍历

文章到这结束啦,感谢阅读~

如果文章的论述或代码等出现错误,欢迎前来指正!

如果你觉得文章写的还不错,记得点赞收藏评论三连~ ❤

img

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

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

相关文章

【GUI开发基础】

GUI开发基础 &#x1f31f;项目文件组成✨浅析Pro文件配置 &#x1f31f;Qt设计师&#x1f31f;剖析UI文件运行机制&#x1f31f;UI设计方式✨可视化UI设计✨代码化UI设计 &#x1f31f;项目文件组成 创建一个QtGUI项目&#xff1a; open QtCreator —> select Creator Pr…

2024 电工杯高校数学建模竞赛(B题)| 平衡膳食食谱 |建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;运用负载均衡&#xff0c;多目标规划等强大工具&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模问题求解的风潮。 抓紧小秘籍&am…

2024 电工杯高校数学建模竞赛(A题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024电工杯数学建模竞赛&#xff08;B题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解…

【计算机网络原理】浅谈应用层协议的自定义和传输层UDP协议的总结

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

Javascript特效之鼠标悬停特效【css】

先看一看效果&#xff0c;是不是很炫酷啊&#xff1f;&#xff1f; HTML代码&#xff1a; <!DOCTYPE html> <html><head><meta charset""UTF-8"" /><title>CSS特效&#xff1a;鼠标悬停效果</title><link rel&q…

LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

Java面试题--基础篇,更新中...

1、 Java语言有哪些特点 简单易学、有丰富的类库 面向对象&#xff08;Java最重要的特性&#xff0c;让程序耦合度更低&#xff0c;内聚性更高&#xff09; 与平台无关性&#xff08;JVM是Java跨平台使用的根本&#xff09; 可靠安全 支持多线…

列举几个淘宝商品详情API接口测试示例

API名&#xff1a;item_get 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes…

学生手机管理方案

咱们现在的学生&#xff0c;手机几乎成了标配。所以问题就来了&#xff0c;怎么管理这些手机&#xff0c;让手机在课堂上不成为学习的干扰&#xff1f; 先得搞明白&#xff0c;手机在学生手里上该扮演什么角色。手机确实能帮学生查资料、交流学习&#xff0c;甚至写作业&#x…

初识java——javaSE(6)抽象类与接口【求个关注!】

文章目录 前言一 抽象类1.1 抽象类的概念1.2 抽象类的语法&#xff1a;1.3 抽象类与普通类的区别&#xff1a; 二 接口2.1 接口的概念2.2 接口的语法2.2.1 接口的各个组成2.2.2 接口之间的继承 2.3 接口的实现接口不可以实例化对象 2.4 接口实现多态 三 Object类3.1 Object类是…

如何配置机器人ROS操作系统之间的有线和无线的局域网通信(基于ROS的主从通讯)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. 主从配置前的准备工作(1) 查看主从机的hostname(2) 查看各自主机和从机的IP(3) 本教程的hostname和ip如下 2. 在主机中的修改(1) 修改主机的/.bashr文件(2) …

5.1 Go 函数的定义与调用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

刷题之寻找重复数(leetcode)

寻找重复数 这题实际上就是变形的环形链表Ⅱ&#xff0c;下标为index的下一个元素是nums[index]&#xff0c;下下一个元素是nums[nums[index]] class Solution { public:int findDuplicate(vector<int>& nums) {int fast0;int slow0;while(1){fastnums[nums[fast]]…

数据采集与AI分析,亮数据+通义千问助力跨境电商前行

文章目录 前言工具介绍数据采集工具亮数据Web Scraper IDE亮点 AI数据分析工具 实战电商数据采集与AI分析电商平台选取数据采集完全托管数据集自定义数据集 AI分析 价格总结 前言 随着信息技术的飞速发展&#xff0c;数据采集与AI分析在跨境电商中扮演着越来越重要的角色。通过…

ENVI光谱识别指导采矿管理者监测铜矿分布

圣地亚哥SRGIS的GIS专家Chile需要利用影像光谱信号勘察Chuquicamata的铜矿分布。 解决方案 Chuquicamata是世界上最大的斑岩铜矿分布区。SRGIS发现西部地区只有有限的矿物和贫瘠的岩石&#xff0c;但东部有铜矿分布。为了进一步测定矿藏的情况&#xff0c;他们开发出一套程序&a…

Skywalking快速介绍

&#xff08;01&#xff09;SkyWalking简介 SkyWalking专为微服务&#xff0c;云原生架构和基于容器&#xff08;Docker&#xff0c;k8s&#xff0c;Mesos等&#xff09;的架构设计的应用程序性能监控工具&#xff0c;用于收集、分析、聚合和可视化来自服务和云原生基础设施的数…

【数据结构与算法】之堆及其实现!

目录 1、堆的概念及结构 2、堆的实现 2.1 堆向下和向上调整算法 2.2 堆的创建 2.3 建堆时间复杂度 2.4 堆的插入 2.5 堆的删除 2.6 完整代码 3、完结散花 个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#…

OpenCV与AI深度学习 | 高效开源的OCR工具:Surya-OCR介绍与使用

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;高效开源的OCR工具&#xff1a;Surya-OCR介绍与使用 1 背景 在众多企业应用中&#xff0c;光学字符识别 (OCR) 是一项基础技术。在本文中&…

AI视频教程下载:全面掌握ChatGPT和LangChain开发AI应用(附源代码)

这是一门深入的课程&#xff0c;涉及ChatGPT、LangChain和Python。打造专注于现实世界AI集成的AI应用&#xff0c;课件附有每一节涉及到的源代码。 **你将学到什么&#xff1a;** - 将ChatGPT集成到LangChain的生产风格应用中 - 使用LangChain组件构建复杂的文本生成管道 - …

OpenFeign微服务调用组件使用

前言&#xff1a;OpenFeign是可以跨服务、跨进程的调用方式。 什么是Feign Feign是Netflix开发的声明式、模版化的HTTP客户端。 优势: Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验&#xff0c;开发者完全感知不到这是远程方法&#xff0c;更感知不到这…