【数据结构】第6章 树(下)

数据结构第6章 树(下)

§6.4 树和森林

6.4.1 树的储存结构

①父亲表示法(利用每个(除根)结点只有唯一的父亲的性质)

②孩子表示法(用广义表实现)

③孩子兄弟表示法(二叉链表指向第一个孩子结点和下一个兄弟结点)

6.4.2森林与二叉树的转换

二叉树和树都可以用二叉链作为储存结构(分别是孩子表示法和孩子兄弟表示法),给定一棵树,可以找到唯一的一棵二叉树与之对应。两者的物理结构是相同的,只是解释不同而已(旋转)。

任何一棵和树对应的二叉树,其右子树必空(因为根是没有兄弟的),在森林中可以利用这一性质把第二棵树的根结点看做第一棵树的根结点的兄弟

至此,森林或树与二叉树可以相互转换。

①森林转换成二叉树

如果F={T1,T2,…,Tm}是森林,则可以按如下的规则转换成一棵二叉树B=(root,LB,RB)。

⑴若F为空,即m=0,则B为空树。

⑵若F非空,即m!=0,则B的根root即为森林中第一棵树的根ROOT(T1);B的左子树LB是从T1中根结点的子树森林F1={T11,T12,…,T1m1}转换而成的二叉树;其右子树RB是从森林F’={T2,T3…Tm}转换而成的二叉树

②二叉树转换成森林

如果B=(root,LB,RB)是一棵二叉树,则可按如下规则转换成森林F={T1,T2,..,Tm}

⑴若B为空,则F为空。

⑵若B非空,则F中第一棵树T1的根ROOT(T1)即为二叉树B的根root;T1中的根结点的子树森林F1是由B的左子树LB转换而成的森林;F中除T1之外的其余树组成的森林F’={T2,T3…,Tm}是由B的右子树RB转换而成的森林。

6.4.3 树和森林的遍历

当以二叉链表作为树的储存结构时,树(或森林)的先序遍历和后序遍历可以借用二叉树的先序遍历和中序遍历算法实现。

§6.5 树与等价问题

(就是并查集,不废话了)

§6.6 Huffman树及其应用

6.6.1 最优二叉树(Huffman树)

从树上一个结点到另一个结点之间的分支构成两个结点之间的路程,路径上的分支数目称作路径长度,树的路径长度是从树根到每一个结点的路径长度之和

结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所有叶子结点的带权路径长度之和。

树的带权路径长度记作

WPL(Weighted Path Length of Tree) = (w1l1+w2l2+……+wnln)

WPL最小的二叉树就是最优二叉树(Huffman树)

Huffman树的构造方法:贪心法,每一步都取最小的两个结点合并。

Huffman树的特点:

①没有度为1的点(n1=0)(这类树又称作严格的(或正则的)二叉树)

②有n个叶子结点的Huffman树共有 (2n-1) 个结点

③Huffman树实际上是无序的

6.6.2 Huffman编码

要设计长短不等的编码,则必须任一字符的编码都不是另一个字符编码的前缀(前缀编码)。

可以利用Huffman树来构造WPL最小的二叉树来实现Huffman编码(前提是编码都用01表示)

如图

§6.7 回溯法与树的遍历

DFS思想 递归思想 回溯思想

§6.8树的计数

结论:含有n个结点的不相似的二叉树有 C(n,2n)/(n+1) 棵

二叉搜索树,平衡二叉树,B树等树形搜索数据结构放入第九章搜索整理。至此第6章笔记整理结束。

时间: 2024-10-25 02:29:08

【数据结构】第6章 树(下)的相关文章

数据结构-王道2017-第4章 树与二叉树-树、森林

1.树的存储结构有多种,既可以采用顺序存储结构,也可以采用链式存储结构,都要求能唯一地反映出树中各结点之间的逻辑关系,三种常用的存储结构 1)双亲表示法 采用一组连续空间来存储每个结点,同时在每个结点中增设一个伪指针,指示其双亲节点在数组中的位置,根节点下标为0,其伪指针域为-1. #define MAX_TREE_SIZE 100 //树中最多结点数 typedef struct{ //树的结点定义 ElemType data; //数据元素 int parent; //双亲位置域 }PTNo

数据结构——第三章树和二叉树:02二叉树

1.二叉树的存储结构: (1)二叉树的顺序存储表示: #define MAX_TREE_SIZE 100 //二叉树的最大结点数 typedef TElemType SqBiTree[MAX_TREE_SIZE]; SqBiTree bt; (2)二叉树的链式存储表示: ①二叉链表: typedef struct BiTNode //结点结构 { TElemType data; struct BiTNode *lchild, *rchild; //左右孩子指针 } BiTNode, *BiTre

数据结构-王道2017-第4章 树与二叉树-二叉树的遍历

typedef int ElemType; typedef struct BitNode { ElemType data; //数据域 struct BitNode *lchild, *rchild; //左右孩子指针 }BitNode,*BitTree; void visit(BitNode *b) { printf("%d ", b->data); } //无论采用哪种遍历方法,时间复杂度都是O(n),因为每个结点都访问一次且仅访问一次,递归工作栈的栈深恰好为树的深度,空间复

数据结构——第五章 树与二叉树

树是一对多的结构 结点:树的小圆圈 度:结点有多少个分叉 叶子结点:结点的度为0 双亲:parent 孩子:child 二叉树:树的度不超过2 满二叉树:每一层都是满的 完全二叉树:除了最后一层都是满的,最后一层左边都是齐全连续的. 性质1:对一颗二叉树,第i层最多有2的i-1次方个 性质2:对一颗二叉树,最多有2的i次方-1个 性质3:n0=n2+1 n0+n1+n2=n(n0--结点度为0的个数,n2--结点度为2的个数) 性质4:具有n个结点的完全二叉树深度为 math.floor(log

数据结构——第三章树和二叉树:01树和二叉树的类型定义

1.树的类型定义: (1)数据对象D:D是具有相同特性的数据元素的集合. (2)数据关系R:若D为空集,则成为空树 否则:在D中存在唯一的称为根的数据元素root.当n>1时,其余结点可分为n(n>0)个互不相交的有限集T1, T2, T3, ..., Tm,其中每一棵子集本身又是一课符合本定义的树,称为根root的子树. 2.树的基本操作: (1)查找类: ①Root(T):求树的根结点 ②Value(T, cur_e):求当前结点的元素值 ③Parent(T, cur_e):求当前结点的双

数据结构——第三章树和二叉树:03树和森林

1.树的三种存储结构: (1)双亲表示法: #define MAX_TREE_SIZE 100 结点结构: typedef struct PTNode { Elem data; int parent; //双亲位置域 } PTNode; (2)孩子双亲链表表示法: typedef struct PTNode { Elem data; int parent; //双亲位置域 struct CTNode* nextchild; } *ChildPtr; (3)树的二叉链表(孩子-兄弟)存储表示法:

数据结构 第5章 树的二叉树 单元小结(2)遍历二叉树和线索二叉树

概念: 遍历二叉树: 遍历:指按某条搜索路线遍访每个结点且不重复(又称周游). 遍历的用途:它是树结构插入.删除.修改.查找和排序运算的前提,是二叉树一切运算的基础和核心. 时间效率: O(n) //每个结点最多访问两次 空间效率: O(n) //栈占用的最大辅助空间 用栈进行迭代运算 和队列很像 先序: 中序: void PreOrderlteration(BiTree T) void InOrderIteration(BiTree T) { stack<BiTree> s; stack&l

【数据结构】第6章 树(上)

第一次用markdown-..好高端的赶脚 数据结构第6章 树(上) §6.1 树的定义和基本术语 树是n(n>=0)个结点的有限集 在非空树中有且仅有一个特定的根(root) 树的结构定义是一个递归的定义,即在树的定义中又用到了树的概念,有嵌套集合表示法,广义表表示法和凹入表示法等. 术语: 结点,结点的度(子树个数),叶(度为0),树的度(最大结点度),孩子,父亲,兄弟,祖先(上溯所有结点),子孙(下溯所有结点),层次,堂兄弟,树的深度(最大层次),有序树(左右子树有顺序,如二叉树),无序树

数据结构学习之第7章 树和二叉树

数据结构学习之第7章 树和二叉树 0x7.1.1 树的基本概念 ?1.树的定义 ? 树是由n(n>=0)个结点(或元素)组成的有限集合(记为T) ? 如果n>0,这n个结点中有且仅有一个结点作为树的根结点,简称为根,其余结点可分为m(m>=0)个互不相交的有限集\[T_{1}T_{2}\cdots T_{m}\],其中每个子集又是一棵符合定义的子树,称为根结点的子树. 知识点:由树的定义我们可以看出来树的结构是递归的 ?2.树的逻辑表示法 ? 1.树形表示法 ? 2.文氏图表示法 ? 3