数据结构::树,二叉树

时间:2021-10-20 17:29:58

【树】:

1、树的相关概念:

1)树是n(n>=0)个有限个数据的元素集合,形状像一颗倒过来的树。

数据结构::树,二叉树

2)节点:结点包含数据和指向其它节点的指针。
3)根节点:树第一个结点称为根节点。
4)结点的度:结点拥有的子节点个数。
5)叶节点:没有子节点的节点(度为0)。
6)父子节点:一个节点father指向另一个节点child,则child为孩子节点,father为父亲节点 。
7)兄弟节点:具有相同父节点的节点互为兄弟节点。
8)节点的祖先:从根节点开始到该节点所经的所有节点都可以称为该节点的祖先。
9)子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
10)树的高度:树中距离根节点最远节点的路径长度

这些概念比较琐碎,我在网上看到对树的这些概念形象的用图进行描述的比较好,在这里我分享给大家:

数据结构::树,二叉树

2、树的存储结构

用上图来说明:

1)首先树里面肯定有值和节点,所以我们可以用结构体来存储

struct TreeNode
{
DataType _data;
TreeNode* node;(此时这个节点待定)
};
2)但是树里的节点有的是有孩子的有的是没有的,这要怎么来安排上面的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