初识二叉树

文章目录

  • 一.什么是树
  • 二.什么是二叉树
  • 三.二叉树的访问次序
  • 四.特殊的二叉树
  • 五.求结点个数
  • 六.平衡二叉树
  • 总结

一.什么是树

树是由一个集合以及在该集合上定义的一种关系构成的。 集合中的元素称为树的节点,所定义的关系称为父子关系。 父子关系在树的节点之间建立了一个层次结构。 在这种层次结构中有一个节点具有特殊的地位,这个节点称为该树的根节点,或称为树根。

结点

结点是数据结构中的基础,是构成复杂数据结构的基本组成单位。

结点的度

结点拥有的子树数目称为结点的度。

二.什么是二叉树

二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。

特点

1.每一个节点最多有两棵子数,及二叉树不存在度大于二的节点

2.二叉树的子树有左右之分,其子树的次序不能够颠倒

3.任何一个二叉树都有三部分,根节点左子树右子树

结构

typedef int	BTDataType;
typedef struct Binary TreeNode
{struct Binary TreeNode* left;//左孩子struct Binary TreeNode* right;//右孩子BTDataType data;//数据
}BTNode;

三.二叉树的访问次序

3.1前序遍历 (根结点 > 左子树 > 右子树)

主要是利用了函数递归的方法去遍历,先根节点左子树右子树不断地去调用自己

void PreOrder(BTNode* root)
{if (root == NULL)return;printf("%d", root->data);//根PreOrder(root->left);//左子树PreOrder(root->right);//右子树}

3.2中序遍历和后序遍历

void MidOrder(BTNode* root)
{if (root == NULL)return;MidOrder(root->left);//左子树printf("%d", root->data);//根MidOrder(root->right);//右子树
}void afterOrder(BTNode* root)
{if (root == NULL)return;afterOrder(root->left);//左子树afterOrder(root->right);//右子树printf("%d", root->data);//根
}

3.3层序遍历

前中后序遍历其实也叫深度优化遍历,序遍历叫广度优化遍历

我们利用队列来实现层序遍历

核心思路:上一层带下一层的

先创造一个队列,如果跟节点不为空的话,把根节点放入这个队列中,循环的判断条件被列中没有元素就停下来,有元素就继续去队列投元素,放入树的头,然后再删去队列这个元素,然后把删去元素所对应的左子树和右子树放入,一层一层的遍历

void LeveOrder(BTNode* root)
{//创建队列Queue q;Queue Init(&q);//如果根节点不为空,在队列里放入if (root != NULL){QueuePush(&q, root);}while (!QueueEmpty(&q)){//删去元素所对应的左子树和右子树放入一层一层的遍历BTNode* front = QueueFront(&q);QueuePop(&q);printf("%c", front->data);if (front->left != NULL){QueuePush(&q, front->left);}if (front->right != NULL){QueuePush(&q, front->right);}}printf("\n");QueueDestory(&q);
}

四.特殊的二叉树

4.1满二叉树

假设一个满二叉树的高为h,则它的总结点个数为N,则高为2^0+2^1+....+2^(h-1)=N,h=log2(N+1)

4.2完全二叉树

特征:1.前n-1层是满的。2.最后一层不满,但最后一层从左往右都是连续的

特别公式:对于任何一颗二叉树,如果度为零的叶子节点个数为n0,度为二的分支节点个数为n2则n0=n2+1

例:存在一个2n个结点的完全二叉树,则它的叶子结点大小的个数为__

完全二叉树度为1的结点个数要么是1个,要么没有。设度为0的结点为x0,度为1的为x1,度为二的为x2,所以说套入两个公式,x0+x1+x2=2n,x0=x2+1.可以算出2x0+x1-1=2n,又因为完全二叉树所以x1为0或者1,带入可得n或者2n+1/2

五.求结点个数

其实二叉树还有一个平衡结构,叫做平衡二叉树,需要非常灵活的掌握函数递归和分治的思想,所以我们先来利用递归和分治思想来求一下结点

5.1求叶子结点的个数

利用递归和分治的思想

int TreeLeafsize(BTNode* root)
{if (root == NULL)return 0;//如果左子树和右子树都为空说明找到了一个叶子结点,返回1if (root->left == NULL && root->right == NULL)return 1;//利用函数递归的思路,先左子树在右return TreeLeafsize(root->left) + TreeLeafsize(root->right);
}

5.2求总结点个数

void Treesize(BTNode* root, int* psize)
{if (root == NULL){return;}//是结点就加加else{(*psize++);}//也是递归,分治先左子树在右子树Treesize(root->left,psize);Treesize(root->right,psize);
}

六.平衡二叉树

定义:平衡二叉树也叫AVL树,它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和左子树的高度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。

6.1二叉树的深度

分治思路:如果为空高度直接为零,非空就分解子问题,先求左右指数的深度,我的深度等于左右,质数深度大的大小,加1。

int maxDepth(BTNode* root)
{if (root == NULL)return 0;int leftDepth = maxDepth(root->left);int rightDepth= maxDepth(root->right);//左边的深度如果大于右边的话,就加1反之右边加1return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}

6.2平衡树的判断

bool isBalaned(BTNode* root)
{//第一种情况,如果为空的话就是的if (root == NULL)return true;//利用深度函数来求出左右子树的深度int leftDepth = maxDepth(root->left);int rightDepth = maxDepth(root->right);//利用递归判断高度差的绝对值不超过1,左右都要是平衡二叉(递归)return abs(leftDepth - rightDepth) < 2 && isBalaned(root->left) && isBalaned(root->right);
}


总结

这只是初次学习二叉树,它的内容可不只有这些,还要深度的还需要不断的学习积累才可实现

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

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

相关文章

安装OneNote for Win10 | Win10/Win11

前言 PC端的OneNote分为2个版本&#xff0c;分别是Microsoft Store版本和Office版本&#xff0c;Microsoft Store版本即为OneNote for Win10&#xff0c;此版的OneNote有最近笔记功能&#xff0c;但检索功能不如Office版本&#xff0c;个人认为2个版本各有优劣。 但OneNote f…

新人应该从哪几个方面掌握大数据测试?

什么是大数据 大数据是指无法在一定时间范围内用传统的计算机技术进行处理的海量数据集。 对于大数据的测试则需要不同的工具、技术、框架来进行处理。 大数据的体量大、多样化和高速处理所涉及的数据生成、存储、检索和分析使得大数据工程师需要掌握极其高的技术功底。 需要你…

nodejs中使用@maxmind/geoip2-node 查询地理位置信息

介绍 maxmind/geoip2-node 是一个Node.js模块&#xff0c;用于与MaxMind的GeoIP2数据库进行交互&#xff0c;从而获取IP地址的地理位置信息。MaxMind的GeoIP2数据库包含了全球范围内的IP地址和对应的地理位置信息&#xff0c;如国家、城市、经纬度等。使用maxmind/geoip2-node…

Python连接MariaDB数据库

2024软件测试面试刷题&#xff0c;这个小程序&#xff08;永久刷题&#xff09;&#xff0c;靠它快速找到工作了&#xff01;&#xff08;刷题APP的天花板&#xff09;【持续更新最新版】-CSDN博客 Python连接MariaDB数据库 一、安装mariadb库 pip install mariadb 二、连接…

机器视觉学习(六)—— 图像的颜色识别

目录 一、色彩空间 1.1 RGB色彩空间 1.2 HSV色彩空间 1.3 灰度 1.4 CMYK色彩空间 1.5 Lab色彩空间 二、色彩空间转换 三、识别颜色 3.1 识别一种特定的颜色 3.2 识别多种颜色 一、色彩空间 计算机视觉中常用的色彩空间有RGB色彩空间、HSV色彩空间、CMYK色彩空间、La…

34-Java传输对象模式 ( Transfer Object Pattern )

Java传输对象模式 实现范例 传输对象模式&#xff08;Transfer Object Pattern&#xff09;用于从客户端向服务器一次性传递带有多个属性的数据传输对象也被称为数值对象&#xff0c;没有任何行为传输对象是一个具有 getter/setter 方法的简单的 POJO 类&#xff0c;它是可序列…

解锁AI之门:协助探索Amazon Bedrock服务

AI愈加强大的功能和广泛的应用场景&#xff0c;正逐渐改变着我们的工作和生活方式。 Amazon Bedrock在AI的时代潮流中&#xff0c;也以其强大而灵活的功能特性&#xff0c;正在成为越来越多企业和个人的智能助手。 亚马逊云科技通过VERYCLOUD睿鸿股份的服务能力&#xff0c;使…

揭秘!自定义三维模型如何在RflySim中实现仿真(一)

一.技术背景 在无人系统研发过程中&#xff0c;需要进行大量的运动控制系统半物理实时仿真实验&#xff0c;传统仿真界面的运动轨迹显示多采用的是二维曲线形式&#xff0c;运动过程和状态是通过文本数据显示。随着数据量的增加&#xff0c;该方式缺乏直观性&#xff0c;不易观…

python四川火锅文化网站的设计与实现flask-django-php-nodejs

四川火锅文化网站的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&#xff0c;…

蓝桥杯单片机快速开发笔记——特训2 按键的长按与短按

一、题目要求 在CT107D单片机综合训练平台上&#xff0c;通过I/O模式编写代码&#xff0c;实现以下功能&#xff1a; 系统上电后&#xff0c;关闭蜂鸣器、继电器和全部指示灯&#xff0c;数码管显示初始值为28&#xff0c;仅显示数码管最右边两位。利用定时器0实现10ms间隔定…

预测一下,GPT-5 会在什么时候发布,又会有哪些更新?

发布预期&#xff1a;GPT-5预计将于11月发布&#xff0c;可能与ChatGPT发布两周年同期。竞争态势&#xff1a;谷歌的Gemini与GPT-4 turbo已展开竞争。逐步发布&#xff1a;GPT-5可能通过模型训练过程中的中间检查点逐步发布。训练与安全测试&#xff1a;实际训练可能需3个月&am…

发布 AUR 软件包 (ArchLinux)

首发日期 2024-03-09, 以下为原文内容: 理论上来说, 我们应该平等的对待每一个 GNU/Linux 发行版本. 但是, 因为窝日常使用 ArchLinux, 所以对 ArchLinux 有一些特别的优待, 比如自己做的软件优先为 ArchLinux 打包发布. 本文以软件包 librush-bin 为例, 介绍发布 AUR 软件包的…

【IC设计】Verilog线性序列机点灯案例(四)(小梅哥课程)

文章目录 该系列目录&#xff1a;设计环境设计目标设计思路RTL及Testbench代码RTL代码Testbenchxdc约束 仿真结果 声明&#xff1a;案例和代码来自小梅哥课程&#xff0c;本人仅对知识点做做笔记&#xff0c;如有学习需要请支持官方正版。 该系列目录&#xff1a; Verilog线性…

力扣热门算法题 52. N 皇后 II,53. 最大子数组和,54. 螺旋矩阵

52. N 皇后 II&#xff0c;53. 最大子数组和&#xff0c;54. 螺旋矩阵&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.20 可通过leetcode所有测试用例。 目录 52. N 皇后 II 解题思路 完整代码 Python Java 53. 最大子数组…

长安链开源社区发布2023年度长安链优秀应用案例

1月27日结束的“长安链发布三周年庆暨生态年会”上&#xff0c;在国家区块链技术创新中心的指导下&#xff0c;长安链开源社区联合长安链生态联盟正式发布2023年度长安链行业示范案例、领域精品案例及特色创新案例。 本次评选面向2023年度应用长安链上线并取得应用成效的案例&…

Matlab在高光谱遥感中的作用:从数据处理到决策支持

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

vue中如何实现子组件相互切换,而且数据不会丢失

项目场景&#xff1a; 今天的项目场景: 项目为数据报表,但是一个父页面中有很多的子页面,而且子页面中不是相互关联,但是数据又有联系. 问题描述 子页面相互切换的时候之前填写好的数据会丢失,无法保存.这样想提交所有的子页面的数据就出现问题. 原因分析&#xff1a; 分析原因…

外包干了20天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入杭州某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了2年的功能测试…

SpringCloud详解,图文码笔记

注意&#xff1a; SpringCloud并 不等于 微服务 1.微服务技术线 2.认识微服务 分布式架构 分布式架构: 根据业务功能对系统进行拆分&#xff0c;每个业务模块作为独立项目开发&#xff0c;称为一个服务。 优点&#xff1a; 降低服务耦合有利于服务升级拓展 服务治理 分布式…

基于Java的绩效考核系统的设计与实现

今天要和大家聊的是一款基于Java的绩效考核系统的设计与实现 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&#x1f495;个人简介…