第六章 树《大话数据结构》读后笔记

第六章 树《大话数据结构》读后笔记

第五章 串《大话数据结构》读后笔记


树的定义

树是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:

  1. 有且只有一个特的根(Root)结点;
  2. 当你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;

上述树双亲表示为

下标dataparent
01-1
120
230
341
452
562
683
793
8103
  • 孩子表示法

任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此我们设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟。
结构如下:

datafirstchildrightsib

这种表示法 给查找某个结点的某个孩子带来的方便。
其实这种表示法把一棵复杂的树变成了一棵二叉树

二叉树的定义

二叉树(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。

二叉树的存储结构

  • 二叉树的顺序存储结构

在这里插入图片描述

完全二叉树适合用顺序结构存储如上图可以用以下方式存储:

下标0123456789
数据ABCDEFGHIJ
  • 二叉链表
    因为二叉树每个结点最多有两个孩子
    | 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. 第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。当所有的二叉树连接起来后就得到了右森林转换来的二叉树。

赫夫曼树

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值