第八章:C语言数据结构与算法初阶之树

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、什么是树
    • 1、树的概念
    • 2、非树
      • 树的子节点之间没有联系
      • 树的子节点有且仅有一个父节点
    • 3、树的术语
    • 4、树的表示——孩子兄弟表示法
  • 二、二叉树
    • 1、满二叉树
    • 2、完全二叉树
  • 三、二叉树的性质
  • 总结


前言


树是一种非常重要的数据结构。

一、什么是树

1、树的概念

树是一种 非线性 的数据结构,它是由n(n>=0)个有限节点组成一个具有层次关系的集合。
线性结构其实就是一对一的感觉,比如我们之前学的顺序表、链表、栈、队列他们都是一对一的,而非线性结构自然就是一对多的,如下图所示:
第八章:C语言数据结构与算法初阶之树_第1张图片
这个图中的非线性结构,将其倒过来的时候其实就形似一棵树,因此这种非线性结构就称之为

2、非树

树的子节点之间没有联系

树的子节点之间是没有联系的。下图所示的图中红线连接两个子节点,所以这个结构就不是树。
第八章:C语言数据结构与算法初阶之树_第2张图片

树的子节点有且仅有一个父节点

子节点通过红线连接了新的父节点,导致这些子节点的父节点不只有一个。因此这种结构不称之为树。
第八章:C语言数据结构与算法初阶之树_第3张图片

3、树的术语

第八章:C语言数据结构与算法初阶之树_第4张图片

节点的度
一个节点含有的子树的个数称之为度,简而言之,该节点直接相连了几个子节点,他的度就是多少。

叶结点
没有子节点的节点称之为叶节点,即度为0的节点称之为叶节点。

父节点
若一个节点有子节点,那么这个节点就是那些子节点的父节点。

子节点
若一个节点有父节点,那么这个节点就是父节点的子节点。

节点的祖先
从根到该节点的路径上,所有在该节点上方的节点都是该点的祖先。

子孙
以某一节点为根的子树中任一节点。

节点的层次
从根节点开始定义起,根为第一层,根的子节点为第二层,以此类推。

树的高度或深度
树中节点的最大层次。

4、树的表示——孩子兄弟表示法

第八章:C语言数据结构与算法初阶之树_第5张图片
我们创建一个结构体,这个结构体除了存储该节点的数据外,还要存储左边第一个子节点的地址,以及右边第一个兄弟节点的地址。这样就能有效地串通所有的节点。

struct TreeNode
{
	int a;
	struct TreeNode *firstchild;
	struct TreeNode *nextbrother;
};

二、二叉树

二叉树是一种特殊的树,节点的度都小于等于2。
第八章:C语言数据结构与算法初阶之树_第6张图片

1、满二叉树

满二叉树是一种特殊的二叉树,除了叶节点的度为0外,其余节点的度均为2。
第八章:C语言数据结构与算法初阶之树_第7张图片

2、完全二叉树

第八章:C语言数据结构与算法初阶之树_第8张图片
完全二叉树前N-1层是满的,最有一层可以不满,但必须从左到右是连续的,所以满二叉树是特殊的完全二叉树。

三、二叉树的性质

  1. 若规定根节点的层数是1,则一棵非空二叉树的第i层上最多有2(i-1)个节点。

  2. 若规定根节点的层数是1,则深度为h的二叉树的最大节点数是2h-1。

  3. 对任何一棵二叉树,度为0的叶结点个数为n0,度为2的节点个数为n2​,则有n0 = n2 + 1​

  4. 若规定根节点的层数为1,具有n个节点的满二叉树的深度为h,h=log2(n+1)

  5. 对于具有n个节点的完全二叉树,如果按照从上至下从左到右的数组顺序对所有节点从0开始编号,则对于序号为i的节点有:

    • 若 i>0,i位置节点的父节点的序号为:(i-1)/2, i=0的时候,i为根节点的编号,没有父亲节点。

    • 若2i+1=n,没有左孩子。

    • 若2i+2=n,没有右孩子。

第八章:C语言数据结构与算法初阶之树_第9张图片

从上面的图片中的规律所示,我们能得到如下推导:
第N层:2^(N-1)

所以最多节点数为:
MAX = 20 + 21 + … + 2N-1= 2N + 1
MIN = 2N-1 + 2

设节点的个数为N,满二叉树的高度为h:
h = log2(N+1)


总结

树是一种非线性结构,二叉树是特殊的树。
生活的情况越艰难,我越感到自己更坚强,甚而也更聪明。——高尔基

你可能感兴趣的:(#,C语言之数据结构初阶,c语言,链表,数据结构)