树和二叉树
目录
一、名词解释
1.树的度
任意子树拥有的子树节点的个数的最大值。
二、树的表示法
1.双亲表示法
以数组储存形式为例:时间复杂度=O(1)
结构体内包括{1.内容;2.双亲(Parent)指针}
![](https://img-blog.csdnimg.cn/0f898ad5917f45eca1cfbaeedcff718b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQWExMDIzNjU0Nzg=,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/1ffbd43bbdb647c0b408372bdcd9c107.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQWExMDIzNjU0Nzg=,size_20,color_FFFFFF,t_70,g_se,x_16)
两种拓展形式,只需增加结构体之中的内容。插入兄弟(Sib)指针或子(Child)指针。
注意: 1.根(root)的双亲指针为 -1。
2.兄弟指针特指在同一子树内部的右边的兄弟指针。
2.孩子表示法
1.根据树的度,声明足够空间存放子树的节点(大量浪费空间)。
2.根据子树的数量,声明空间存放子树的节点(大量浪费时间)。
3.类链表形式表述:
![](https://img-blog.csdnimg.cn/aa602b885857480c957adcb0acde628a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQWExMDIzNjU0Nzg=,size_20,color_FFFFFF,t_70,g_se,x_16)
3.双亲孩子表示法
结构体内既包含双亲(Parent)指针,又包含孩子(Child)指针。
![](https://img-blog.csdnimg.cn/9c8753d2af1347259bf48dfc75d6b175.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQWExMDIzNjU0Nzg=,size_20,color_FFFFFF,t_70,g_se,x_16)
#define MAX 100
struct Data
{
int data;
};
//孩子节点(上图中的右侧孩子)
typedef struct CTNode
{
int child; //孩子节点的下表
struct CTnode* next; //指向下一个孩子节点的指针
}*ChildPtr;
//表头结构(上图中的左侧每一行)
typedef struct
{
struct Data data; //数据
int parent; //存放双亲的下标
ChildPtr firstchild; //指向第一个孩子的指针
}CTBox;
//树结构(上图中的左侧整个矩阵)
typedef struct
{
CTBox nodes[MAX]; //节点数组
int r,n;
};
4.孩子兄弟表示法
三、二叉树
性质:1.在二叉树的第i层上至多有个节点。
2.深度为k的二叉树至多有个节点。
3.对于任何一个二叉树T,如果其叶节点数为,度为二的节点数为
,
则
注意:1.每个节点最多两个子树。
2.左子树和右子树有顺序不能颠倒。
3.某个节点只有一个子树也要区分它是左子树还是右子树。
![](https://img-blog.csdnimg.cn/7a9c7f95cb2f45a4a967efb81bfff9da.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQWExMDIzNjU0Nzg=,size_20,color_FFFFFF,t_70,g_se,x_16)
斜树
如上图中的左2、左3。
满二叉树
所有分支节点都既有左子树,又有右子树,并且所有叶子都在同一行上(最下一层)。
![图源小甲鱼](https://img-blog.csdnimg.cn/073cd36aabe94e3db86461b60dc65031.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQWExMDIzNjU0Nzg=,size_14,color_FFFFFF,t_70,g_se,x_16)
完全二叉树
性质: 1.具有个节点的完全二叉树的深度为
为向下取整
2.对于1中的完全二叉树,把节点按照层序编号(第一层为1、第二层为2 ......)
2-1.如果,则节点
是二叉树的根,无双亲;
如果,则其双亲是
2-2.如果,则节点
无左孩子(节点
为叶子节点)
如果,则其左孩子是节点
2-3.如果,则节点
无右孩子
如果,则其右孩子是节点
1.叶子节点只能出现在最下层。
2.最下层的叶子只能集中出现在左部连续位置。
3.倒数第二层,若有叶子节点,一定出现在右部连续位置(同2)。
4.如果节点度为1,则该节点只有左孩子。
5.同样节点数的二叉树,完全二叉树的深度最小。
![](https://img-blog.csdnimg.cn/13bedcf8dab8447d821474dc50d432b7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQWExMDIzNjU0Nzg=,size_15,color_FFFFFF,t_70,g_se,x_16)
注意:满二叉树一定是完全二叉树,反之不一定。
二叉树的存储结构
顺序存储结构:运用完全二叉树的思想(实际操作中我们所用的树不是二叉树),将不存在的节点用空指针(^)表示。(若是斜树,则冗余多)
链式存储结构:存储指向两个孩子的指针
typedef struct BiTNode
{
struct Data data; \\数据域
struct BiTNode *lchild; \\指向左孩子的指针
struct BiTNode *rchild; \\指向右孩子的指针
}BiTNode, *BiTree;