第六章 树《大话数据结构》读后笔记
作者:互联网
第六章 树《大话数据结构》读后笔记
文章目录
树的定义
树是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:
- 有且只有一个特的根(Root)结点;
- 当你n>1时 起雨阶点可以分为m个互不相交的有限集T1、T2 …Tm,其中每个集合又是一棵树并称为子树(SubTree)
树的深度或高度:是指树中结点最大层次上述树的深度为4。
有序树:树中各子树看成从左到右是有次序的、不能互换的。
树的存储结构
#define MAX_TREE_SIZE 100
typedef int TElemType;
typedef struct PTNode
{
TElemType data;
int parent;
} PTNode;
typedef struct
{
PTNode nodes[MAX_TREE_SIZE];
int r,n;
} PTree;
上述树双亲表示为
下标 | data | parent |
---|---|---|
0 | 1 | -1 |
1 | 2 | 0 |
2 | 3 | 0 |
3 | 4 | 1 |
4 | 5 | 2 |
5 | 6 | 2 |
6 | 8 | 3 |
7 | 9 | 3 |
8 | 10 | 3 |
任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此我们设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟。
结构如下:
data | firstchild | rightsib |
---|
这种表示法 给查找某个结点的某个孩子带来的方便。
其实这种表示法把一棵复杂的树变成了一棵二叉树。
二叉树的定义
二叉树(Binary Tree)是 n (n>=0) 个结点的有限集和,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。
二叉树的性质
性质1:在二叉树的第i层上至多有2^i-1(2>=1)
性质2:深度为k的二叉树至多有2^k - 1个结点
性质3: 对任何一棵二叉树T,如果其终端结点数为n0 ,度为2的结点数为n2,则n0=n2+1;
性质4:具有n个结点的完全二叉树的深度为log2n +1
性质5:对一棵有n个结点的完全二叉树深度为「log2n」+ 1 的结点按层序编号对任一结点i(1<=i<=n)有:
1。如果i = 1,则结点i是二叉树的根,无双亲;如果i>1,则双亲是结点「i/2」。
2。如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i.
3。如果2i + 1>n, 则结点i无右孩子;否则其右孩子是结点2i+1。
二叉树的存储结构
完全二叉树适合用顺序结构存储如上图可以用以下方式存储:
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
数据 | A | B | C | D | E | F | G | H | I | J |
- 二叉链表:
因为二叉树每个结点最多有两个孩子
| lchild | data | rchild|
|–|--|–|
遍历二叉树
二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。
规则是若二叉树为空,则空返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。遍历顺序为:ABDGHCEIF。
算法代码:
/*二叉树的前序遍历递归算法*/
void PreOrderTraverse(BiTree T){
if(T==NULL)
return;
printf("%c", T->data); /*显示结点数据,可以更改为其他对结点操作*/
PreOrderTraverse(T->lchild);/* 先遍历左子树*/
PreOrderTraverse(T->rchild);/* 最后先序遍历右子树*/
}
规则是若二叉树为空,则空返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。遍历顺序为:GDHBAEICF。
/*二叉树的中序遍历递归算法*/
void InOrderTraverse(BiTree T){
if(T==NULL)
return;
InOrderTraverse(T->lchild);/* 中序遍历左子树*/
printf("%c", T->data); /*显示结点数据,可以更改为其他对结点操作*/
InOrderTraverse(T->rchild);/* 最后中序遍历右子树*/
}
规则是若树为空,则空返回,否则从左到右先叶子后结点的方式遍历左右子树,最后访问根结点。。遍历顺序为:GHDBIEFCA。
/*二叉树的后序遍历递归算法*/
void PostOrderTraverse(BiTree T){
if(T==NULL)
return;
PostOrderTraverse(T->lchild);/* 后序遍历左子树*/
PostOrderTraverse(T->rchild);/* 最后中序遍历右子树*/
printf("%c", T->data); /*显示结点数据,可以更改为其他对结点操作*/
}
规则是若树为空,则空返回,否则从左到右先叶子后结点的方式遍历左右子树,最后访问根结点。。遍历顺序为:ABCDEFGHI。
二叉树的遍历性质
- 已知前序遍历序列和中序遍历序列,可以唯一确定一棵二叉树。
- 已知后序遍历序列和中序遍历序列,可以唯一确定一棵二叉树。
树、森林与二叉树的转换
树转换为二叉树步骤:
1。加线。在所有兄弟结点之间加一条线。
2。去线。对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其他子结点之间的连线。
3。层次调整。以树的根结点为轴心将整棵树顺时针旋转一定角度,使之层次分明。
森林转换二叉树:
1。把每个树 转化为二叉树
2. 第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。当所有的二叉树连接起来后就得到了右森林转换来的二叉树。
赫夫曼树
标签:结点,遍历,大话,右子,前序,二叉树,中序,数据结构,读后 来源: https://blog.csdn.net/zhengshaopeng_1/article/details/117257179