当前位置:   article > 正文

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

数据结构树

树的定义:

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

  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. 灵活性:可以根据需要轻松地扩展节点结构,例如添加额外的属性或指针

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

  1. typedef struct TreeNode
  2. {
  3. int val;
  4. struct TreeNode* left;
  5. struct TreeNode* right;
  6. }Tree;

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

  1. typedef struct TreeNode
  2. {
  3. int val;
  4. struct TreeNode* leftChild;
  5. struct TreeNode* rightBrother;
  6. }Tree;

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/927924
推荐阅读
相关标签
  

闽ICP备14008679号