ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-05-26 18:59:40  阅读:182  来源: 互联网

标签:结点 遍历 大话 右子 前序 二叉树 中序 数据结构 读后


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

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

文章目录


树的定义

树是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. 第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。当所有的二叉树连接起来后就得到了右森林转换来的二叉树。

赫夫曼树

标签:结点,遍历,大话,右子,前序,二叉树,中序,数据结构,读后
来源: https://blog.csdn.net/zhengshaopeng_1/article/details/117257179

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有