数据结构——二叉树_(上)

news2024/11/18 16:51:58

学习二叉树之前我们首先要对树有一个认识,树是一种非线性结构,它是由n(n>=0)个有限节点组成的一个具有层次关系的节点;而这个层次结构倒过来看就十分的像一棵树,所以起名树结构。

跟现实中的树一样,树结构也有一个根,这个根节点是没有先驱节点的,可以认为其是始源

除根结点外,其余结点被分成M(M>0)个互不相交的集合,其中每一个集合又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继;从这段定义中我们就可以看到其有递归的影子,一个节点即是一个子节点也是一个根节点

下面我们对几个定义进行学习

        1、树是非线性结构

        2、任何一颗树都由根和子树够成

        3、节点的度:指拥有几个子树

        4、叶子节点就是度为0的树

        5、兄弟节点:具有相同父亲节点的节点

        6、树的深度和高度:树中节点的最大层次

        7、森林:指多棵树互不相交的集合

        8、节点的祖先:从根节点到该节点所经分支的所有节点;子孙:以某节点为根的子树中任一节点都成为该节点的子孙

       注意:在树结构中子树是不相交的

                  除根节点每一个节点都只有一个父节点

                  一个N个节点的树有N-1条边

那么下面我们就来学习如何定义一个树形结构,先看看树形结构长什么样()

那么看到这就有小伙伴问了,这些个节点怎么连起来的啊,他们的值又是怎么保存的

那么请看代码

typedef int Node_Date
typedef struct Node
{
    struct Node*left_child;    //用于指向左子节点
    struct Node*right_child;   //用于指向右子节点
    Node_Date x;               //用于存放数据,数据的类型更改则需要更改typedef
}Node;

了解:当然还有一种表示方法:即左孩子又兄弟结构

        在我们不知道度是多少的时候左孩子右兄弟表示法会方便很多:只找到第一个孩子,剩下的让兄弟指针依次相连具体什么样让我们看一张图

在了解完树形结构后,我们来学习树中很重要的一种二叉树,顾名思义就是每一个节点最大的度为2即最多有两个子节点;上图

二叉树特性:1、二叉树不存在度大于2的节点

                      2、二叉树有左右子树之分,次序不能颠倒;因此二叉树是有序树

二叉树存在以下几种情况

 二叉树分为:满二叉树与完全二叉树

       满二叉树:每一层都是满的(高度为h)

 计算节点个数:S=2^0+2^1+2^2+.......+2^(n-1) =2^h  -1

满二叉树有n个节点,则高度h为log 2^(n+1)

        完全二叉树:前h-1层都是满的(高度为h),且最后一层是从左向右依次连续

 节点个数:2^(h-1)-1+1   ~    2^h -1;

计算完全二叉树我们可以理解为h-1层是满的再加1个,也可以理解为差1个节点第h层就满了,相当于2^h-1个这两种情况之内都是第h层的范畴内

完全二叉树有N个节点则高度h为 log2^N+1  ~   log2^(N+1)

结论:对于任何一颗二叉树,如果度为0其叶节点个数为n0

           度为2的分支节点个数为n2,则有n0=n2+1

           即度为0的个数比度为2的多一个

例1:具有2n个节点的完全二叉树种叶子节点个数为多少?

        2n=n0+n1+n2  =n0+n1+n0-1    =2*n0-1+n1  =n1-1;

因为

1、度为0的比度为2的多一个,此处n0为叶子节点,n1为一个叶子节点,n2为两个叶子节点

2、完全二叉树度为1的节点要么为1要么为0

综上两条度为1的叶子节点只能是1;

在对二叉树的基本概念与定义有所学习后,我们来看看二叉树的遍历

二叉树遍历:前序遍历、中序遍历、后序遍历、层序遍历

前序:根节点——>左子树——>右子树

中序:左子树——>根节点——>右子树

后序:左子树——>右子树——>根节点

//定义结构
typedef int BTDataType

typedef struct BinaryTree
{
    BTdataType data;
    struct BinaryTreeNode* left;
    struct BinaryTreeNode* right;
}BTNode;

BTNode* BuyNode(BTDataType x)
{
    BTNode* node=(BTnode*)malloc(sizeof(BTNode));
    if(node==NULL)
    {
        perror("malloc::fail");
        return;
    }
    node->data=x;
    node->left=NULL;
    node->right=NULL;
    return node;
}

//前序遍历
void PrevOrder(BTNode* root)
{
    if(root==NULL)
    {
         return ;   
    }
    printf("%d ",root->data);
    PrevOrder(root->left);
    PrevOrder(root->right);
}

//中序遍历
void InOrder(BTNode* root)
{
    if(root==NULL)
    {
         return ;   
    }
    
    InOrder(root->left);
    printf("%d ",root->data);
    InOrder(root->right);
}

//后序遍历
void PostOrder(BTNode* root)
{
    if(root==NULL)
    {
         return ;   
    }
    
    PostOrder(root->left);
    PostOrder(root->right);
    printf("%d ",root->data);
}

上面就是针对二叉树的遍历

问1:求二叉树的节点的个数

两种方法:1、使用全局遍量(或者在结构中定义一个记录大小的size)

                  2、分治

第一种:使用全局变量

int size=0;
void Treesize(BTNode* root)
{
    if(root==NULL)
    {    
        return ;
    }
    size++;
    Treesize(root->left);
    Treesize(root->right);
}
//但是使用全局变量是不安全的,并且每次运行都必须将size重置,而这又是极为不方便的

第二种:分治

int TreeSize(BTNode* root)
{
    if(root==NULL)
    {
        return 0;
    }
   return TreeSize(root->left)+TreeSize(root->right)+1;
    
}
//从叶子节点开始向根节点累加,在这个过程中将节点统计完成

问2:求二叉树的深度

int TreeHeight(BTNode* root)
{
    if(root==NULL)
    {
        return 0;
    }
    
//方法1:每一个上层都不记录下层的数据,在进行比较大小后又需要重新统计结果
    return  TreeHeight(root->left)>TreeHeight(root->right)?
                                TreeHeight(root->left)+1 : 
                                TreeHeight(roo->right)+1;

//方法2:将结果保存下来再判断;
    int left_h=TreeHeight(root->left);
    int right_h=TreeHeight(root->right);
    return left_h>right_h ? left_h+1 : right_h +1;
}

层序遍历:将树进行层序遍历

 前面我们学习了三种遍历方式,层序遍历则是将每一层遍历完再去遍历下一层

 

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

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

相关文章

Altium Designer18基础

原理图 第5课 元件库介绍及电阻容模型的创建.mp4_哔哩哔哩_bilibili 原理图库(schLib) 1. 创建原理图库: panels -> SCHLIB:左侧弹出SCH Lib窗口 Add:新建原理图库 点击原理图库名称:进入原理图库设置…

【短视频矩阵系统源码搭建+二开源码定制部署】

短视频矩阵源码的框架有很多种,根据不同的业务需求和技术要求,可选择适合的框架。目前常见的短视频矩阵源码框架有:Flutter、React Native、Vue、Angular等前端框架;Spring Boot、Laravel等后端框架;FFmpeg、Pusher、W…

ChatGPT“保姆级教程”——手把手教你5分钟快速AI智能文字转爆款视频(剪映+百度AIGC平台)

目录 前言ChatGPT 剪映ChatGPT生成视频文档安装专业版剪映使用剪映一键出片保姆集教程 百度AIGC平台注册百度AIGC平台使用百度AIGC平台一键出片保姆集教程 总结其它资料下载 前言 在这个数字时代,视频已经成为了最流行的内容形式之一。而如何自动将文字转化为引人…

JavaScript实现输入学生姓名,按q键程序结束的代码

以下为实现输入输入学生姓名,按q键程序结束的程序代码和运行截图 目录 前言 一、输入学生姓名,按q键程序结束 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择,您可以在目录里进行快速查找&#…

Web应用技术(第十三周/第二次练习/7h)

本次练习基于how2java和课本,学习MyBatis高级映和分页 1.MyBatis高级映射:1.1 相关XML标签及其属性:(1)mapper标签:(2)DOCTYPE标签:(3)typeAliase…

【MySQL】MySQL体系架构

文章目录 背景一、MySQL体系架构二、网络连接层三、数据库服务层3.1 连接池3.2 系统管理和控制工具3.3 SQL接口3.4 解析树3.5 查询优化器3.6 缓存 四、存储引擎层五、系统文件层5.1 日志文件5.2 数据文件5.3 配置文件5.4 pid文件5.5 socket文件 背景 很多小伙伴工作很长时间了…

【OJ比赛日历】快周末了,不来一场比赛吗? #05.27-06.02 #14场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2023-05-27(周六) #8场比赛2023-05-28…

Holocube-第一集

准备工作: 装备: ESP 8266 D1 MINI1.3寸 TFT 屏幕分光棱镜25.4mm面包板、杜邦线、数据线等配件 软件: Arduino(本人使用1.8.16)---驱动ch341 初始arduino简单程序,对esp8266上传代码,能正常运行。正式开始 坑1&…

Day0:Windows编程环境搭建

前言:学习一个东西,首先要有三问: 1. 这个东西是什么? 2. 为什么要学它? 3. 该怎么学习它? 第一问是要明白你要学习的东西它是什么,你就会对它有一个整体的了解。这也是第二问的半个答案&#x…

有没有想过一种可能,30岁之后,转行去做IT售前?

灵魂拷问 IT行业的变化是非常迅速的,各种新技术、新产品、新观念、新的业务模式层出不穷,不仅是我们,客户也在不断地学习进步,因此我们注定要终身学习。 IT售前这个岗位为许多IT职场人提供了一种新的选择: 你不需要成为某一方面…

微信小程序推送消息

微信小程序推送消息 前言一、推送消息:小程序“订阅消息”功能二、开发步骤1.小程序调用wx.requestSubscribeMessage,进行消息订阅用户授权2.小程序调用wx.login,获取code3.后端访问请求,获取用户openId4.后端访问请求&#xff0c…

树形dp问题套路

⭐️前言⭐️ 本篇文章旨在将二叉树中的树形dp问题模板化,借助信息体传递的方式,通解树形dp问题。 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主将持续更新学习记录收获,友…

双目测距联合YOLOv8 项目总结

代码贴:双目测距--5 双目相机 联合 YOLOv8_爱钓鱼的歪猴的博客-CSDN博客 1、单目标定(张友正标定法) 获得左相机、右相机的cameraMatrix(内部参数值)、disCoeffs(畸变矩阵) 2、双目标定 固定左右相机的内部参数值、…

File类和IO流的相关面试(二)

一.IO流 1.什么是IO? I:Input,数据的读取,数据的输入 数据的输入,可以是从键盘输入,从文件读取,从网络接收... O:Output,写数据,数据的输出 数据的输出,可…

C++服务器框架开发2——头文件memory/typedef

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见:[C高级教程]从零开始开发服务器框架(sylar) 上一篇:C服务器框架开发1——项目介绍/分布式/#ifndef与#pragma once C服务器框架开发2——头文件memory/typedef 目前进度memoryty…

C4D R26 渲染学习笔记 建模篇(1):参数模型

往期文章 介绍篇 C4D R26 渲染学习笔记(1):C4D版本选择和初始UI框介绍 C4D R26 渲染学习笔记(2):渲染流程介绍 C4D R26 渲染学习笔记(3):物体基本操作快捷键 建模篇 …

JVM内存结构介绍

我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。其中有些区域随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动和结束…

[Data structure]栈

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐所属专栏:数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现,有时候有C/C代码。 ⭐如果觉得文章写的…

一文学会随机森林在sklearn中的实现

1 概述 集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通 过在数据上构建多个模型,集成所有模型的建模结果。基本上所有的机器学习领域都可以看到集成学习的身影,在 现实中集成学习也有相当大的作用,它可以用来做市场…

8、URP自定义屏幕后处理

回到目录 大家好,我是阿赵。这次来说一下URP渲染管线里面怎样使用后处理效果,还有怎样去自定义后处理效果。 一、使用URP自带的后处理效果 要使用URP自带的后处理效果,方法很简单,和Unity内置渲染管线的PostProcessing后处理很…