系列文章目录
文章目录
前言
树是一种非常重要的数据结构。
一、什么是树
1、树的概念
树是一种 非线性 的数据结构,它是由n(n>=0)个有限节点组成一个具有层次关系的集合。
线性结构其实就是一对一的感觉,比如我们之前学的顺序表、链表、栈、队列他们都是一对一的,而非线性结构自然就是一对多的,如下图所示:
这个图中的非线性结构,将其倒过来的时候其实就形似一棵树,因此这种非线性结构就称之为 树。
2、非树
树的子节点之间没有联系
树的子节点之间是没有联系的。下图所示的图中红线连接两个子节点,所以这个结构就不是树。
树的子节点有且仅有一个父节点
子节点通过红线连接了新的父节点,导致这些子节点的父节点不只有一个。因此这种结构不称之为树。
3、树的术语
节点的度
一个节点含有的子树的个数称之为度,简而言之,该节点直接相连了几个子节点,他的度就是多少。
叶结点
没有子节点的节点称之为叶节点,即度为0的节点称之为叶节点。
父节点
若一个节点有子节点,那么这个节点就是那些子节点的父节点。
子节点
若一个节点有父节点,那么这个节点就是父节点的子节点。
节点的祖先
从根到该节点的路径上,所有在该节点上方的节点都是该点的祖先。
子孙
以某一节点为根的子树中任一节点。
节点的层次
从根节点开始定义起,根为第一层,根的子节点为第二层,以此类推。
树的高度或深度
树中节点的最大层次。
4、树的表示——孩子兄弟表示法
我们创建一个结构体,这个结构体除了存储该节点的数据外,还要存储左边第一个子节点的地址,以及右边第一个兄弟节点的地址。这样就能有效地串通所有的节点。
struct TreeNode
{
int a;
struct TreeNode *firstchild;
struct TreeNode *nextbrother;
};
二、二叉树
二叉树是一种特殊的树,节点的度都小于等于2。
1、满二叉树
满二叉树是一种特殊的二叉树,除了叶节点的度为0外,其余节点的度均为2。
2、完全二叉树
完全二叉树前N-1层是满的,最有一层可以不满,但必须从左到右是连续的,所以满二叉树是特殊的完全二叉树。
三、二叉树的性质
-
若规定根节点的层数是1,则一棵非空二叉树的第i层上最多有2(i-1)个节点。
-
若规定根节点的层数是1,则深度为h的二叉树的最多节点数是2h-1。
-
对任何一棵二叉树,度为0的叶结点个数为n0,度为2的节点个数为n2,则有n0 = n2 + 1
-
若规定根节点的层数为1,具有n个节点的满二叉树的深度为h,h=log2(n+1)
-
对于具有n个节点的完全二叉树,如果按照从上至下从左到右的数组顺序对所有节点从0开始编号,则对于序号为i的节点有:
-
若 i>0,i位置节点的父节点的序号为:(i-1)/2, i=0的时候,i为根节点的编号,没有父亲节点。
-
若2i+1<n,左孩子序号:2i+1;若2i+1>=n,没有左孩子。
-
若2i+2<n,右孩子序号:2i+2;若2i+2>=n,没有右孩子。
-
从上面的图片中的规律所示,我们能得到如下推导:
(N为根节点层数为1的二叉树层数)
第N层:2^(N-1)
所以最多节点数为:
MAX = 20 + 21 + … + 2N-1= 2N - 1
MIN = 2N-1
设节点的个数为X,完全二叉树的高度为h:
最多:h = log2(X+1)
最少:h = log2X - 1
总结
树是一种非线性结构,二叉树是特殊的树。
生活的情况越艰难,我越感到自己更坚强,甚而也更聪明。——高尔基