您的位置:首页 > 编程语言 > C语言/C++

C语言版树结构复习

2020-08-16 21:54 225 查看

树结构简介:

在将树结构之前我们要清楚了解数据结构的物理结构和逻辑结构这两个概念点,物理结构存储结构
物理结构表示的形式是数据项或者数据元素在内存中的存储的形式。它分为两种:顺序存储链式存储
这两种的区别在于顺序存储需要的是在内存中一块连续的内存空间让他使用。例如0x00000001->0x000000010;这区间必须是连续不断的。
链式存储相反与顺序存储,它的每一个数据项也叫节点的地址在内存中可以连续也可以分散,他的地址分布是不可控的。例如第一个节点的地址是0x00000001,那么第二个节点的地址可能就会变成0x00000100;那么他们之间的联系就是靠节点内部定义一个指针指向下一个节点的地址。
典型代表 顺序结构-----顺序表(数组),链式结构------链表

链表:
逻辑结构:物理结构讲完了,接下来就是逻辑结构。它描述的是元素之间的逻辑关系。一般存在:数据之间没有关系(集合)数据元素之间存在一对一的关系(数组,队列,栈)数据元素之间存在一对多的关系(树)数据元素之间存在多对多的关系(图)
所有对于逻辑结构的定义就是:是用来描述数据与数据之间的关系的结构。
同时,对于逻辑结构,又划分为:线性结构非线性结构
综上所述,因为物理结构和逻辑结构的多样性,树也分为顺序树和链式树两种实现方法。

树的分类:

树的结构很特殊,每一个节点都可以连接两个或以上的子节点。所以从古至今的各位大神们也就发现了许多功能的树
分类:

1、空树:没有任何叶子节点的数
2、普通树:这种类型就是很正常的树,每一个节点有1个或以上的分支,(默认> 所有节点的最高分支数是一样的,不会出现原本最高是3个分支,但是有一个节点有四个分支的情况),但是注意树和二叉树与多叉树是由区别的,树算是一种特殊的图,所以不能为空,但是广义上来说,普通树还算是树结构。
3、二叉树:完全二叉树,满二叉树,有有序树,搜索树,平衡二叉树,红黑树等等
4、多叉树
5、单叉树

树的表示方法:倒悬树、嵌套法、凹凸法。
树的专业术语
节点:组成树的基础元素,同时它也是一棵树。
节点的度:该节点子树的数量。
树的度(密度):树中节点的数量。
叶子节点:节点的度为0的节点。
双亲和孩子:节点的子树被称为孩子节点,该节点就是它们的双亲。
兄弟:具有同一个双亲节点,被称为兄弟节点。
祖先:从根节点出发到该节点,经过的所有节点都被称为该节点的祖先。
子孙:一个节点的子树中的任意一个节点都被称为它的子孙。
节点的层次:根节点层次为1,它的孩子层次为2,孩子的防止层次为3,依次类推。
堂兄弟:双亲在同一层互为堂兄弟。
树的深度:树的最大层次为树的深度。
森林:n个不相交的树的集合被称为森林。

//顺序树结构的结构体的实现
typedef struct Binery_Tree
{
int *arr;
int cal;
}Binery_Tree;

上面结构体里的arr就是保存树节点信息用的数组(也就是数组指针)。

typedef struct TreeNode
{
int val;
struct TreeNode *lchild;
struct TreeNode *rchild;
}TreeNode;

二叉树的存储:

二叉树:是n个元素的有限结合,是由一个根的元素及两个不相交的左子树和右子树构成是有序树。当集合为空时,也成空二叉树。注意空树默认为空二叉树。
二叉树可以顺序存储、链式存储,也可以混合存储,由于存储的信息不同,有以下表示方式:**
双亲表示法:顺序**
位置  data 双亲
0    A   -1
1    B   0
2    C   0
3    D   1
4    E   2
5    G   4
6    F   4
7    H   2
优点:方便找到双亲,缺点:查找孩子节点不方便。
孩子表示法:
顺序:浪费空间
位置  data sub_arr
0    A    1,2
1    B    3
2    C    4,7
3    D
4    E    5,6
5    G
6    F
7    H
链式:节约空间
位置  data ListHead
0    A
1    B
2    C
3    D
4    E
5    G
6    F
7    H
优点:方便找孩子,缺点:不方便找双亲结点。
兄弟表示法:
双亲只存储第一个子节点,然后链式指向所有兄弟节点。
优点:可以方便的查询到兄弟节点 缺点:查询双亲比较麻烦
数据 第一个子节点 兄弟节点头指针

二叉树的性质:

性质1:二叉树的第i层上最多有2^(i-1)个节点。
每层的节点数都是2^(i-1),这种树叫满二叉树。
对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
性质2:深度为h的二叉树中至多含有2^h-1个节点。
性质3:若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1。
性质4:具有n个节点的完全二叉树深为log2^n+1。
性质5:若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),那么,对于编号为i(i≥1)的节点:
当i=1时,该节点为根,它无双亲节点。
当i>1时,该节点的双亲节点的编号为i/2(顺序存储)。
如果2*i<=n,则编号为2*i 的节点是有编号为i的左孩子。
如果2*i+1<=n,则编号为 2*i+1 的节点是编号为i的右孩子。

下面附上一棵有序二叉树的实现的链接:
有序二叉树实现(C语言版)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: