【树】:
1、树的相关概念:
1)树是n(n>=0)个有限个数据的元素集合,形状像一颗倒过来的树。
2)节点:结点包含数据和指向其它节点的指针。
3)根节点:树第一个结点称为根节点。
4)结点的度:结点拥有的子节点个数。
5)叶节点:没有子节点的节点(度为0)。
6)父子节点:一个节点father指向另一个节点child,则child为孩子节点,father为父亲节点 。
7)兄弟节点:具有相同父节点的节点互为兄弟节点。
8)节点的祖先:从根节点开始到该节点所经的所有节点都可以称为该节点的祖先。
9)子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
10)树的高度:树中距离根节点最远节点的路径长度
这些概念比较琐碎,我在网上看到对树的这些概念形象的用图进行描述的比较好,在这里我分享给大家:
2、树的存储结构:
用上图来说明:
1)首先树里面肯定有值和节点,所以我们可以用结构体来存储
struct TreeNode2)但是树里的节点有的是有孩子的有的是没有的,这要怎么来安排上面的node节点
{
DataType _data;
TreeNode* node;(此时这个节点待定)
};
3)于是我们可以联想到vector容器类来进行动态的申请节点,这是一种方式
4)前几篇中,我详细讲解了广义表,有的同学了解的,想必已经想到可以用广义表
5)那么现在的我们沿袭了一种很经典的创建树的节点的方法:引入了左孩子右兄弟
struct TreeNode
{
Datatype _data;
TreeNode* _left; //左孩子
TreeNode* _right; //右兄弟
};
3、树的应用:
我们可以看到,C盘就相当于根节点,下面的文件夹就是它的孩子,将其中的一个文件夹打开,有的为空就是叶子节点喽。
【二叉树】:
1、二叉树的定义:
二叉树是每个节点最多有两个子树的结构
2、二叉树的性质:
1)二叉树的每个结点至多只有二棵子树(不存在度大于2的结点)
2)二叉树的子树有左右之分,次序不能颠倒。
3)二叉树的第i层至多有2^{i-1}个结点;
4)深度为k的二叉树至多有2^k-1个结点;
5)对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
3、二叉树的分类:
分为完全二叉树和满二叉树
1)完全二叉树:只有最后一层的节点是不满的,并且只能是从左到右的不满
2)满二叉树:所有的节点都是满的
注:因此满二叉树是完全二叉树,但是完全二叉树不一定是满二叉树
4、二叉树的存储方式:
1)静态存储:用数组来表示
举例:
上面举得例子树是差不多都满的,如果是下图这样的树:
这样用数组进行存储的时候,我们可以看到,有很多没有节点的,如果使用数组的话就会造成空间的浪费。
2)动态存储(链式存储)
有两种方式:
A:二叉链表:
B:三叉链表
二叉链表和三叉链表的区别以及用法:
**二叉链表不能访问到双亲,只能往孩子的方向进行访问,三叉链表可以访问双亲
**三叉链表浪费空间,存储密度比二叉链表低
**总的来说这两者就有点像链表和顺序表,使用的是否便捷性和具体的问题有关
5、二叉树的四种遍历方式
1)前序遍历:根节点-->左子树-->右子树
2)中序遍历:左子树-->根节点-->右子树
3)后序遍历:左子树-->右子树-->根节点
4)层序遍历:一层一层的遍历
下面我来举个例子:
A:前序遍历的结果是:1,2,3,4,5,6
B:中序遍历的结果是: 3,2,4,1,6,5
C:后序遍历的结果是:3,4,2,6,5,1
D:层序遍历的结果是:1,2,5,3,4,6