数据结构 --- 树(详解)

本文介绍了树的基本概念,包括节点和边的构成,以及根节点、子节点等术语。重点讲解了二叉树的分类(如满二叉树、完全二叉树和二叉搜索树),并详细讨论了完全二叉树的常见运算,如节点计数、高度计算和层次遍历。同时提到了两种树的表示方法及其优缺点。
摘要由CSDN通过智能技术生成

树的定义:

树是一种非线性的数据结构,由节点和边组成。树的定义如下:

  1. 树由节点组成,每个节点可能有零个或多个子节点。
  2. 有且只有一个节点没有父节点,该节点称为根节点。
  3. 除了根节点外,每个节点有且只有一个父节点。
  4. 从根节点到任意节点都存在唯一的路径。

树的节点之间的关系可以用父子关系来描述,每个节点可以有零个或多个子节点,但只能有一个父节点。树的结构使得数据可以以层次结构的方式组织和存储,非常适合用于表示具有层次关系的数据。像我们的文件结构都是树形结构。

树的一些常见术语包括:根节点、叶子节点、父节点、子节点、深度、高度等。

本篇文章主要针对二叉树,当然二叉树是树形的一种,树也不只是二叉树,也是有三叉树,四叉树等结构,但本文不以深究。(二叉树才是程序猿的神)

二叉树常见分类:

(1)满二叉树:每个节点要么没有子节点,要么有两个子节点。换句话说,除了叶子节点外,每个节点都有两个子节点。如下图所示:

(2)完全二叉树:在完全二叉树中,除了最后一层外,其它层的节点都是满的,并且最后一层的节点都靠左排列。换句话说在同一深度下,同一父节点的左子树一定要比右子树先出现。

如上图(b)中,同一父节点D下,没有左子树而有右子树 G,故此树是非完全二叉树。

(3)二叉搜索树:也称为有序二叉树,是一种特殊的二叉树,对于树中的每个节点,其左子树上的所有节点的值都小于该节点的值,右子树上的所有节点的值都大于该节点的值。(左小根,右大根)

注意: 将二叉搜索树进行 先序遍历时,得到的是一个递增的序列。

完全二叉树的常见运算

在完全二叉树中,常见的计算包括:

  1. 节点个数的计算:完全二叉树的节点个数可以通过其高度来计算。如果完全二叉树的高度为h,则节点个数为 2^h - 1

  2. 高度的计算:完全二叉树的高度可以通过其节点个数来计算。如果完全二叉树的节点个数为n,则高度为log2(n+1)

  3. 父节点和子节点的计算:对于完全二叉树中的任意一个节点i,其父节点为 (i-1)/2,左子节点为 2i+1,右子节点为 2i+2

  4. 层次遍历:层次遍历是一种常见的完全二叉树的遍历方式,可以通过队列来实现。按照从上到下、从左到右的顺序遍历完全二叉树的所有节点。

满二叉树的常见运算

  1. 计算节点数量:由于满二叉树的特点是每层节点数都是满的,因此可以通过树的深度来计算满二叉树的节点数量。节点数量为 2^h - 1,其中 h 为树的高度。

  2. 计算树的高度:由于满二叉树的节点数和高度之间有确定的关系,可以通过节点数量来计算树的高度。树的高度为 log2(n+1),其中 n 为节点数量。

二叉树的表示形式

(1) 双指针表示法: (父节点和子节点之间的关系用 left 和 right 指针表示)

此种表示方法:

优点:

  1. 简单直观:结构体定义清晰明了,易于理解和使用。
  2. 灵活性:可以根据需要轻松地扩展节点结构,例如添加额外的属性或指针

缺点:不具备二叉搜索树的性质

typedef struct TreeNode
{
	int val;
	struct TreeNode* left;
	struct TreeNode* right;
}Tree;

(2)左孩子右兄弟表示法:

typedef struct TreeNode
{
	int val;
	struct TreeNode* leftChild;
	struct TreeNode* rightBrother;
}Tree;

优点:  这种表示法比较灵活,可以表示各种形式的树,包括二叉树、多叉树等。

缺点:  操作复杂:对于多叉树的插入、删除、搜索等操作可能比较复杂,需要额外的逻辑来处理右兄弟指针的连接和断开。

总的来说,树这个东西,理论很简单,但针对树一系列运算会很难。

比如: 求深度/高度 ,节点个数, 判断二叉树是否为平衡二叉树或者是否是完全二叉树等。

一起加油吧,少年,你我共勉!!!

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值