数据结构:数和二叉树

news2024/11/27 10:28:01

树概念及结构

树的结构:

树是一种非线性的数据结构,它是由n个有限节点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,即根朝上,叶朝下。

有一个特殊的节点,成为根节点,根节点没有前驱节点

除根节点外,其余节点被分成M个互不相交的集合T1、T2、······Tm,其中每一个集合Ti(1<i<m)又是一棵结构与树类似的子树。每棵子树的根节点有且只有一个前驱,可以有0个或多个后继。

因此,树是递归定义的。

有关树的一些定义:

  • 结点的度:一个节点含有的子树的个数称为该节点的度;如上图:A的度为6
  • 叶节点或终端节点:度为0的节点称为叶节点;如上图B、C、H、I···等节点为叶节点
  • 非终端节点或分支节点:度不为0的节点;如上图:D、E、F、G····等节点为分支节点
  • 双亲结点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;如上图:A是B的父节点
  • 兄弟节点:具有相同父节点的节点互称为兄弟节点;如上图B、C是兄弟节点
  • 树的度:一棵树中,最大的节点的度称为树的度;如上图:树的度为6
  • 节点的层次:从根开始定义起,根为第一层,跟的子节点为第二层。依此类推
  • 树的高度或深度:树中节点的最大层次;如上图,树的高度为4
  • 结点的祖先:从根到该节点所经分支上的所有节点,如上图:所有节点都是A的子孙
  • 森林:由m棵互不相交的多棵树的集合称为森林(并查集);

树的一种表示:

左孩子右兄弟

父节点只指向第一个子节点,其他子结点由第一个子节点指向。以此类推。 

 二叉树的概念及结构:

概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加上两棵别称为左子树和右子树的二叉树组成。

特殊的二叉树:

完全二叉树:

假设树的高度是h

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

完全二叉树中度为1的结点最多有一个(1或0) 

假设完全二叉树最后一层·缺了x个,x的范围[0,2^(h-1)-1],最后一层最少有一个节点

满二叉树:

假设一棵满二叉树的高度为h

总结点的个数:2^0+2^1+2^2……+2^(h-1)=N

2^h-1=N

搜索二叉树:

任何一棵树左子树都比根要小,右子树都比根要大 ,搜索中查找一个数,最多查找高度次

时间复杂度为O(N)

特点:

1. 每个结点最多有两棵子树,即二叉树不存在度大于2的结点

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

任何一棵二叉树由三个部分构成:

1. 根节点

2. 左子树

3.右子树

分治算法:分而治之,大问题分成类似子问题,子问题再分成子问题,直到子问题不可再分割

前序(先根):根 左子树 右子树

中序(中根):左子树 根 右子树

后序(后根):左子树 右子树 根

二叉树的性质:

  1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点
  2. 若规定根节点的层数为1,则深度为h的二叉树的最大节点数为2^h-1
  3. 对任何一棵二叉树,如果度为0其叶结点个数为n0,度为2的分支节点个数为n2,则n0=n2+1
  4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log以2为底的N。 

前序的实现:

先访问根结点,后访问左子树,访问左子树直到访问到空,再访问右子树,用递归即可实现。

typedef int BTDataType;
typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
	BTDataType data;
}BTNode;
void PrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
		
	printf("%c ", root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);
}
int main()
{
	BTNode* A = (BTNode*)malloc(sizeof(BTNode));
	A->data = 'A';
	A->left= NULL;
	A->right = NULL;
	BTNode* B = (BTNode*)malloc(sizeof(BTNode));
	B->data = 'B';
	B->left = NULL;
	B->right = NULL;
	BTNode* C = (BTNode*)malloc(sizeof(BTNode));
	C->data = 'C';
	C->left = NULL;
	C->right = NULL;
	BTNode* D = (BTNode*)malloc(sizeof(BTNode));
	D->data = 'D';
	D->left = NULL;
	D->right = NULL;
	BTNode* E = (BTNode*)malloc(sizeof(BTNode));
	E->data = 'E';
	E->left = NULL;
	E->right = NULL;
	A->left = B;
	A->right = C;
	B->left = D;
	B->right = E;
	PrevOrder(A);
	return 0;
}

中序:

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	PrevOrder(root->left);
	printf("%c ", root->data);
	PrevOrder(root->right);
}

后序:

void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	PrevOrder(root->left);
	PrevOrder(root->right);
	printf("%c ", root->data);
}

计算二叉树的结点个数

1.注意传size的地址

void TreeSize(BTNode* root,int* psize)
{
	if (root == NULL)
		return;
	(*psize)++;
	TreeSize(root->left,psize);
	TreeSize(root->right,psize);
}

2.用递归思想直接解决:

int TreeSize(BTNode* root)
{
	return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}

计算叶子结点的个数

int TreeLeafSize(BTNode* root)
{
	if (root == NULL)
		return 0;
	if (root->left && root->right == NULL)
		return 1;
	return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

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

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

相关文章

详解ZNS SSD基本原理

ZNS SSD的原理是把namespace空间划分多个zone空间&#xff0c;zone空间内部执行顺序写。这样做的优势&#xff1a; 降低SSD内部的写放大&#xff0c;提升SSD的寿命 降低OP空间&#xff0c;host可以获得更大的使用空间 降低SSD内部DRAM的容量&#xff0c;降低整体的SSD成本 降…

15、lambda表达式、右值引用、移动语义

前言 返回值后置 auto 函数名 (形参表) ->decltype(表达式) lambda表达式 lambda表达式的名称是一个表达式 (外观类似函数)&#xff0c;但本质绝非如此 语法规则 [捕获表] (参数表) 选项 -> 返回类型 { 函数体; }lambda表达式的本质 lambda表达式本质其实是一个类…

Windows汇编调用printf

VS2022 汇编 项目右键 生成依赖项 生成自定义 勾选masm 链接器 高级 入口点 main X86 .686 .model flat,stdcall option casemap:none includelib ucrt.lib includelib legacy_stdio_definitions.libEXTERN printf:proc.data szFormat db %s,0 szStr db hello,0.code main…

AI 绘画 | Stable Diffusion 艺术字与光影效果

前言 这篇文章教会你如何使用Stable Diffusion WEB UI扩展插件ControlNet控制光影模型实现艺术字与图片的光影效果。艺术字主要原理是用到了Depth (深度)算法和模型,光影效果是用到了control_v1p_sd15_brightness(亮度)和control_v1p_sd15_illumination(光亮)两个模型其中…

力扣每日一题day32[104. 二叉树的最大深度]

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出…

Spring Boot 3 集成 Druid 连接池详解

在现代的Java应用中&#xff0c;使用一个高效可靠的数据源是至关重要的。Druid连接池作为一款强大的数据库连接池&#xff0c;提供了丰富的监控和管理功能&#xff0c;成为很多Java项目的首选。本文将详细介绍如何在Spring Boot 3项目中配置数据源&#xff0c;集成Druid连接池&…

普冉(PUYA)单片机开发笔记(7): ADC-轮询式多路采样

概述 应用中经常会有使用单片机进行模数转换的需求。PY32F003 具有 1 个 12 位的模拟数字转换器&#xff08;ADC&#xff09;&#xff0c;今天我们一起来使用一下这个 ADC。 数据手册中对 ADC 简介如下。 SAR ADC&#xff1a;逐次逼近式 ADC&#xff0c;原理参见“参考链接&a…

六何分析法分析uniApp

一、什么是 uniApp&#xff08;What&#xff09; uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布iOS、Android、H5、以及各种小程序( 微信/支付宝/百度/头条/00/钉钉/淘宝)、快应用等多个平台。uni-app 在手&#xff0c;…

AI隆重软件,AI原创文章隆重软件

随着信息量的急剧增加&#xff0c;许多写作者、网站管理员和内容创作者们纷纷感受到了文章降重的压力。原始文本的降重&#xff0c;需要保留关键信息的同时避免重复&#xff0c;这是一项既繁琐又耗时的任务。 改写软件的批量降重功能 147SEO改写软件在降重领域的卓越表现主要体…

小目标检测模型设计的一点思考

1. 小目标的特性 目标之间的交叠概率比较低&#xff0c;即使有交叠&#xff0c;其IoU多数情况下也是比较小的 AI-TOD Tiny Person Dateset 小目标自身的纹理显著度有强弱区别&#xff0c;但是总体来说纹理特征都较弱&#xff0c;很多时候需要借助一定的图像上下文来帮助确认 …

自动驾驶学习笔记(十七)——视觉感知

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 分类 目标检测 语义分割 实例分割 …

Angular 从零开始,快速上手

Angular 从零开始&#xff0c;快速上手 一、AngularJS 简介1.1 AngularJS 的背景1.2 AngularJS 的简介1.3 AngularJS 概念概述1.4 AngularJS 特性1.5 AngularJS 和 JQuery 比较 二、安装 AngularJS2.1 方式一&#xff1a;使用在线 cdn2.2 方式二&#xff1a;使用依赖管理工具 n…

三. LiDAR和Camera融合的BEV感知算法-BEV-SAN

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 本次课程我们来学习下课程第三章——LiDAR和Ca…

弧形导轨的结构特点

弧形导轨&#xff0c;顾名思义就是滑座沿着导轨做弧线运动&#xff0c;在工业自动化的许多运用中&#xff0c;直线运动很遍及&#xff0c;但是有些运用&#xff0c;需求弧线运动&#xff0c;或者两个相交或平行的直线运动&#xff0c;需求通过弧线运动衔接起来&#xff0c;那么…

qt可以详细写的项目或技术

1.QT 图形视图框架 2.QT 模型视图结构 3.QT列表显示大量信息 4.QT播放器 5.QT 编解码 6.QT opencv

高级Linux监控堡垒机学习指南

高级Linux监控堡垒机学习指南 在现代复杂的网络环境中&#xff0c;安全性和监控是系统管理的核心关注点。Linux监控堡垒机作为一种安全管理工具&#xff0c;不仅可以追踪系统活动&#xff0c;还能提供对服务器和网络资源的高级监控。本文将深入探讨高级Linux监控堡垒机的学习内…

windows端口被占用怎么办 怎么关闭那个占用的端口

目录 这是出现的情况怎么解决了1.请打开这玩意2.输入下面---查询 先关端口的信息根据id获得服务 上图的8888 对应的ip 上图就是134243.杀死进程134244.重启服务 这是出现的情况 怎么解决了 1.请打开这玩意 2.输入下面—查询 先关端口的信息 netstat -ano过滤信息查询想要的端…

用 Python 自动创建 Markdown 表格

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Markdown表格是文档中整理和展示数据的重要方式之一。然而&#xff0c;手动编写大型表格可能会费时且容易出错。本文将介绍如何使用Python自动创建Markdown表格&#xff0c;通过示例代码详细展示各种场景下的创建…

Python列表的排序方法:从基础到高级

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python列表的排序方法&#xff1a;从基础到高级&#xff0c;全文3400字&#xff0c;阅读大约10分钟。 在Python中&#xff0c;列表是一种常用的数据结构&#xff0c;而对列表…

排序算法之六:快速排序(非递归)

快速排序是非常适合使用递归的&#xff0c;但是同时我们也要掌握非递归的算法 因为操作系统的栈空间很小&#xff0c;如果递归的深度太深&#xff0c;容易造成栈溢出 递归改非递归一般有两种改法&#xff1a; 改循环借助栈&#xff08;数据结构&#xff09; 图示算法 不是…