57
1 数数数数 树树树树 树树树树 树树树 树树树 (Binary Tree) (Binary Tree) 树树树树树树 树树树树树树 树树树树树 树树树树树 (Binary Tree Traversa (Binary Tree Traversa l) l) 树树树树 树树树树 (Tree & Forest) (Tree & Forest) 树树树树 树树树树 (Huffman Tree) (Huffman Tree)

树的概念 二叉树 (Binary Tree) 二叉树的存储 二叉树遍历 (Binary Tree Traversal) 树与森林 (Tree & Forest)

Embed Size (px)

DESCRIPTION

第六章 树与二叉树. 树的概念 二叉树 (Binary Tree) 二叉树的存储 二叉树遍历 (Binary Tree Traversal) 树与森林 (Tree & Forest) 赫夫曼树 (Huffman Tree). 树和森林的概念. 树的定义 树是由 n ( n  0) 个结点组成的有限集合。如果 n = 0 ,称为空树;如果 n > 0 ,则  有一个特定的称之为 根 (root) 的结点,它只有直接后继,但没有直接前驱; - PowerPoint PPT Presentation

Citation preview

Page 1: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

1

数据结构

树的概念树的概念二叉树 二叉树 (Binary Tree)(Binary Tree)二叉树的存储二叉树的存储二叉树遍历 二叉树遍历 (Binary Tree Traversal)(Binary Tree Traversal)树与森林 树与森林 (Tree & Forest)(Tree & Forest)赫夫曼树 赫夫曼树 (Huffman Tree)(Huffman Tree)

Page 2: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

2

数据结构树和森林的概念树和森林的概念

树的定义树的定义 树是由树是由 nn ( (nn 0) 0) 个结点组成的有限集合。个结点组成的有限集合。如果如果 nn = 0 = 0 ,称为空树;如果,称为空树;如果 nn > 0 > 0 ,则,则 有一个特定的称之为有一个特定的称之为根根 (root)(root) 的结点,它的结点,它只有直接后继,但没有直接前驱;只有直接后继,但没有直接前驱; 除根以外的其它结点划分为除根以外的其它结点划分为 mm ( (mm 0) 0) 个个互不相交的有限集合互不相交的有限集合 TT00, , TT11, …, , …, TTmm-1-1 ,每个集合,每个集合又是一棵树,并且称之为根的又是一棵树,并且称之为根的子树子树 (subTree)(subTree) 。。每棵子树的根结点有且仅有一个直接前驱,但可每棵子树的根结点有且仅有一个直接前驱,但可以有以有 00 个或多个直接后继。个或多个直接后继。

Page 3: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

3

数据结构

结点结点 (node)(node) 结点的度结点的度 (degree)(degree) 分支分支 (branch)(branch) 结点结点 叶叶 (leaf)(leaf) 结点结点 子女子女 (child)(child) 结点结点 双亲双亲 (parent)(parent) 结点结点

兄弟兄弟 (sibling)(sibling) 结点结点 祖先祖先 (ancestor)(ancestor) 结点结点 子孙子孙 (descendant)(descendant) 结点结点 结点所处层次结点所处层次 (level)(level) 树的高度树的高度 (height/depth)(height/depth) 树的度树的度 (degree(degree))

Page 4: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

4

数据结构

其他表示法

Page 5: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

5

数据结构

高度

Page 6: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

6

数据结构树的抽象数据类型树的抽象数据类型

P118-119

Page 7: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

7

数据结构二叉树 二叉树 (Binary Tree)(Binary Tree)

二叉树的定义二叉树的定义

二叉树的五种不同形态二叉树的五种不同形态

一棵二叉树是结点的一个有限集合,一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加上该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的、互不相交两棵分别称为左子树和右子树的、互不相交的二叉树组成。的二叉树组成。

Page 8: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

8

数据结构

三个结点构成的不同的二叉树

Page 9: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

用二 叉 树 表达实际问题例 2 双人比赛的所有可能的结局

甲 乙

甲 乙 甲 乙

甲 乙 甲 乙

甲 乙 甲 乙 甲 乙 甲 乙

甲 乙甲 乙 甲 乙 甲 乙

开始开局连赢两局

或五局三胜

Page 10: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

10

数据结构

性质性质 11 若二叉树的层次从若二叉树的层次从 11 开始开始 , , 则在二叉树则在二叉树的第 的第 i i 层最多有 层最多有 22i i -- 11 个结点。个结点。 ((ii 1) 1)

[[ 证明用数学归纳法证明用数学归纳法 ]]

性质性质 22 高度为高度为 kk 的二叉树最多有 的二叉树最多有 22kk-1-1 个结点。个结点。((kk 0) 0)

[[ 证明用求等比级数前证明用求等比级数前 kk 项和的公式项和的公式 ]]

性质性质 33 对任何一棵二叉树对任何一棵二叉树 , , 如果其叶结点个数如果其叶结点个数为 为 nn00, , 度为度为 22 的非叶结点个数为 的非叶结点个数为 nn22, , 则有则有 nn00 == nn22 ++ 11

二叉树的性质二叉树的性质

Page 11: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

11

数据结构

证明:证明:若设度为若设度为 11 的结点有的结点有 nn11 个,总结点个,总结点个数为个数为 nn ,总边数为,总边数为 ee ,则根据二叉树的定,则根据二叉树的定义,义, nn = = nn00 + + nn11 + + nn22 ee = 2 = 2nn22 + + nn1 1 = = nn - 1 - 1因此,有 因此,有 22nn22 + + nn11 = = nn00 + + nn11 + + nn22 - 1 - 1 nn22 = = nn00 - 1 - 1 nn00 = = nn22 + 1 + 1

Page 12: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

12

数据结构

定义定义 11 满二叉树满二叉树 (Full Binary Tree)(Full Binary Tree) 在某一高度拥有最多结点的树。定义定义 22 完全二叉树完全二叉树 (Complete Binary Tree)(Complete Binary Tree)

若设二叉树的高度为若设二叉树的高度为 hh 。除第。除第 hh 层外,其它层外,其它各层各层 (1(1hh-1)-1) 的结点数都达到最大个数,第的结点数都达到最大个数,第 hh 层层从右向左连续缺若干结点,这就是完全二叉树。从右向左连续缺若干结点,这就是完全二叉树。

Page 13: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

13

数据结构

Page 14: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

14

数据结构

性质性质 44 具有具有 nn 个结点的完全二叉树的高度为个结点的完全二叉树的高度为 loglog22((nn+1)+1)

证明:证明:设完全二叉树的高度为设完全二叉树的高度为 hh ,则有,则有 22h-1h-1 -- 1 < 1 < nn 2 2hh-- 1 2 1 2h-1h-1 < < n+n+1 1 2 2hh

取对数 取对数 hh-1 < log-1 < log22((nn+1) +1) hh

Page 15: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

15

数据结构性质性质 55 如果将一棵有如果将一棵有 nn 个结点的完全二叉树自个结点的完全二叉树自

顶向下,同一层自左向右连续给结点编号顶向下,同一层自左向右连续给结点编号 0, 1, 2, 0, 1, 2, …, …, nn-1-1 ,然后按此结点编号将树中各结点顺序地,然后按此结点编号将树中各结点顺序地存放于一个一维数组中存放于一个一维数组中 , , 并简称编号为并简称编号为 ii 的结点的结点为结点为结点 i i (0 (0 i i nn-1-1 。则有以下关系: 。则有以下关系: 若若 i == i == 0, 0, 则 则 i i 无双亲无双亲 若若 i i > 0, > 0, 则 则 i i 的双亲为的双亲为 ((i i -1)/2-1)/2 若若 2*2*ii+1 <+1 < n n, , 则 则 i i 的左子女为的左子女为 2*2*ii+1+1 若若 2*2*ii+2 < +2 < nn, , 则 则 i i 的右子女为的右子女为 2*2*ii+2+2 若 若 i i 为偶数为偶数 , , 且且 ii != 0, != 0, 则其左兄弟为则其左兄弟为 ii-1-1 若 若 i i 为奇数为奇数 , , 且且 ii != != nn-1, -1, 则其右兄弟为则其右兄弟为 ii+1+1 i i 所在层次所在层次为 为 loglog2 2 ((ii+1)+1) +1+1

Page 16: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

16

数据结构

Binary tree

Page 17: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

17

数据结构

P121-123P121-123

二叉树的抽象数据类型二叉树的抽象数据类型

Page 18: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

18完全二叉树的数组表示 一般二叉树的数组表示

二叉树的存储二叉树的存储顺序实现 数组表示顺序实现 数组表示

Page 19: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

19

数据结构

单支树

由于一般二叉树必须仿照完全二叉树那由于一般二叉树必须仿照完全二叉树那样存储,可能会浪费很多存储空间,单样存储,可能会浪费很多存储空间,单支树就是一个极端情况。支树就是一个极端情况。

Page 20: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

20

数据结构

链表存储链表存储

Page 21: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

21

数据结构

链表存储 数据结构链表存储 数据结构

Page 22: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

22

数据结构

二叉树的二叉链表存储表示Typedef struct BiTNode { TelemType data; struct BiTNode *leftchild,*rightchild;} BiTNode,*BiTree;有时也可用数组的下标来模拟指针 ,即开辟三个一维数组 Data ,leftchild,rightchild 分别存储结点的元素及其左 ,右指针域 ;

Page 23: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

23

数据结构

二叉树链表表示的示例

Page 24: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

24

数据结构

二叉链表的静态结构

Page 25: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

25

二叉树遍历二叉树遍历 (Binary Tree Traversal)(Binary Tree Traversal)

所谓遍历,就是按某种次序访问二叉树中所谓遍历,就是按某种次序访问二叉树中的结点,要求每个结点访问一次且仅访问一次。的结点,要求每个结点访问一次且仅访问一次。

设设访问根结点访问根结点记作 记作 VV 遍历根的左子树遍历根的左子树记作 记作 LL 遍历根的右子树遍历根的右子树记作 记作 RR

则可能的遍历次序有则可能的遍历次序有 前序 前序 VLR VLR 镜像 镜像 VRLVRL 中序 中序 LVR LVR 镜像 镜像 RVLRVL

后序 后序 LRV LRV 镜像 镜像 RLVRLV

Page 26: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

26

数据结构

中序遍历二叉树算法的框架是:中序遍历二叉树算法的框架是: 若二叉树为空,则空操作;若二叉树为空,则空操作; 否则否则

– 中序遍历左子树 中序遍历左子树 (L)(L) ;;– 访问根结点 访问根结点 (V)(V) ;;– 中序遍历右子树 中序遍历右子树 (R)(R) 。。

遍历结果遍历结果 aa + + bb * * cc -- dd -- ee / / ff

中序遍历 中序遍历 (Inorder Traversal)(Inorder Traversal)

表达式语法树表达式语法树

Page 27: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

27

数据结构

前序遍历 前序遍历 (Preorder Traversal)(Preorder Traversal)

前序遍历二叉树算法的框架是前序遍历二叉树算法的框架是 若二叉树为空,则空操作;若二叉树为空,则空操作; 否则否则

– 访问根结点 访问根结点 (V)(V) ;;– 前序遍历左子树 前序遍历左子树 (L)(L) ;;– 前序遍历右子树 前序遍历右子树 (R)(R) 。。

遍历结果遍历结果-- + + aa * * bb -- c dc d / / e fe f

Page 28: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

28

数据结构

后序遍历 后序遍历 (Postorder Traversal)(Postorder Traversal)

后序遍历二叉树算法的框架是后序遍历二叉树算法的框架是 若二叉树为空,则空操作;若二叉树为空,则空操作; 否则否则

– 后序遍历左子树 后序遍历左子树 (L)(L) ;;– 后序遍历右子树 后序遍历右子树 (R)(R) ;;– 访问根结点 访问根结点 (V)(V) 。。

遍历结果遍历结果a b c da b c d -- * + * + e fe f / / --

Page 29: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

29

数据结构

中序遍历算法 : #include<stdio.h>#include<stdlib.h>#define NULL 0Typedef struct node{ char data; struct node *leftchild,*rightchild; }TREENODE;TREENODE *root;TREENODE *creat_tree();Void inorder(TREENODE *);

Page 30: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

30

数据结构

TREENODE *creat_tree(){ TREENODE *t; char c; c=getchar(); if(c= =‘#’) return(NULL); else{ t=(TREENODE *)malloc(sizeof(TREENODE)) t – >data=c; t –>leftchild=create_tree(); t –>rightchild=create –tree(); } return(t); }

Page 31: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

31

数据结构

Void inorder(TREENODE *p) { if(p!=NULL) { inorder(p–>leftchild); printf(“%c”,p–>data) inorder(p–>rightchild); }}

Page 32: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

32

数据结构

利用二叉树后序遍历计算二叉树结点个数

int Size (TREENODE *p) { if ( p == NULL ) return 0; else return 1 + Size ( p→leftChild ) + Size ( p→rightChild );}

应用二叉树遍历的事例应用二叉树遍历的事例

Page 33: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

33

数据结构

int Height ( TREENODE *p ) const { if ( p == NULL ) return -1; else return 1 + Max (Height ( p→leftChild ), Height ((p→rightChild ) );}

二叉树的高度

Page 34: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

34

数据结构

遍历的其他应用 遍历的其他应用

Copy Interchange

– all left and right subtrees Width Traversal level by level

Page 35: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

35

数据结构

树的存储表示树的存储表示 广义表表示广义表表示

树的广义表表示 ( 结点的 utype 域没有画出 )

树与森林树与森林

Page 36: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

36

数据结构 双亲表示双亲表示

Page 37: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

37

数据结构 左子女左子女 -- 右兄弟表示右兄弟表示

法法第一种解决方案第一种解决方案

第二种解决方案第二种解决方案

树的左子女树的左子女 -- 右兄弟表示右兄弟表示

data child1 child2 child3 childd

data firstChild nextSibling

Page 38: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

38

数据结构森林与二叉树的转换森林与二叉树的转换

森林与二叉树的对应关系森林与二叉树的对应关系

Page 39: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

39

数据结构(1) (1) 森林转化成二叉树的规则森林转化成二叉树的规则

若若 FF 为空为空,即,即 nn = 0 = 0 ,则,则 对应的二叉树对应的二叉树 BB 为空二叉树。为空二叉树。 若若 FF 不空不空,则,则 对应二叉树对应二叉树 BB 的的根根 root root ((BB)) 是是 FF 中第中第一棵树一棵树 TT11 的根的根 root root ((TT11)) ;; 其其左子树为左子树为 BB ( (TT1111, , TT1212, …, , …, TT11mm)) ,其,其中,中, TT1111, , TT1212, …, , …, TT11mm 是是 root root ((TT11)) 的子树;的子树; 其其右子树为右子树为 BB ( (TT22, , TT33, …, , …, TTnn)) ,其中,,其中,TT22, , TT33, …, , …, TTnn 是除是除 TT11 外其它树构成的森林。外其它树构成的森林。

Page 40: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

40

数据结构(2) (2) 二叉树转换为森林的规则二叉树转换为森林的规则

如果如果 BB 为空为空,则,则 对应的森林对应的森林 FF 也为空。也为空。 如果如果 BB 非空非空,则,则 FF 中第一棵树中第一棵树 TT11 的根为的根为 rootroot ;; TT11 的根的子树森林的根的子树森林 { { TT1111, , TT1212, …, , …, TT11mm }} 是由 是由 root root 的左子树 的左子树 LB LB 转换而来,转换而来, FF 中中除了 除了 TT1 1 之外之外其余的树组成的森林其余的树组成的森林 { { TT22, , TT33, …, , …, TTnn } } 是由 是由 rooroo

t t

的右子树 的右子树 RBRB 转换而成的森林。转换而成的森林。

Page 41: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

41

数据结构树的遍历树的遍历

树的二叉树表示树的二叉树表示

深度优先遍历深度优先遍历

Page 42: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

42

数据结构森林的遍历森林的遍历

森林的二叉树表示森林的二叉树表示

(1) (1) 先根次序遍历的规则:先根次序遍历的规则:

若森林若森林 FF 为空为空 , , 返回;否则返回;否则 访问访问 FF 的第一棵的第一棵树的根结点;树的根结点; 先根次序遍历第先根次序遍历第一棵树的子树森林;一棵树的子树森林; 先根次序遍历其先根次序遍历其它树组成的森林。它树组成的森林。

Page 43: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

43

数据结构森林的遍历森林的遍历

森林的二叉树表示森林的二叉树表示

(2) (2) 中根次序遍历的规则:中根次序遍历的规则:

若森林若森林 FF 为空,为空,返回;否则返回;否则 中根次序遍历第中根次序遍历第一棵树的子树森林;一棵树的子树森林; 访问访问 FF 的第一棵的第一棵树的根结点;树的根结点; 中根次序序遍历中根次序序遍历其它树组成的森林。其它树组成的森林。

Page 44: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

44

数据结构森林的遍历森林的遍历

森林的二叉树表示森林的二叉树表示

(3) (3) 后根次序遍历的规则:后根次序遍历的规则:

若森林若森林 FF 为空,为空,返回;否则返回;否则 后根次序遍历第后根次序遍历第一棵树的子树森林;一棵树的子树森林; 后根次序遍历其后根次序遍历其它树组成的森林;它树组成的森林; 访问访问 FF 的第一棵的第一棵树的根结点树的根结点。

。。

Page 45: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

45

数据结构森林的遍历森林的遍历

森林的二叉树表示森林的二叉树表示

(4) (4) 广度优先遍历广度优先遍历 (( 层次层次序遍历序遍历 ) ) ::

若森林若森林 FF 为空,为空,返回;否则返回;否则 依次遍历各棵树依次遍历各棵树的根结点;的根结点; 依次遍历各棵树依次遍历各棵树根结点的所有子女;根结点的所有子女; 依次遍历这些子依次遍历这些子女结点的子女结点女结点的子女结点。

Page 46: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

46

二叉树的计数二叉树的计数由二叉树的前序序列和中序序列可唯一由二叉树的前序序列和中序序列可唯一地确定一棵二叉树。地确定一棵二叉树。例例 , , 前序序列 前序序列 { {

ABHFDECKG } ABHFDECKG } 和和中序序列 中序序列 { HBDF{ HBDFAEKCG }, AEKCG }, 构造二叉树过程如下:构造二叉树过程如下:

Page 47: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

47

数据结构 如果前序序列固定不变,给出不同的中序序列,如果前序序列固定不变,给出不同的中序序列,

可得到不同的二叉树。可得到不同的二叉树。

问题是有 问题是有 nn 个数据值,可能构造多少种不个数据值,可能构造多少种不同的二叉树?我们可以固定前序排列,选择所有同的二叉树?我们可以固定前序排列,选择所有可能的中序排列。可能的中序排列。

Page 48: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

48

数据结构 例如,有 例如,有 3 3 个数据 个数据 { 1, 2, 3 }{ 1, 2, 3 } ,可得,可得 55 种种

不同的二叉树。它们的前序排列均为不同的二叉树。它们的前序排列均为 123 ,中中序序列可能是序序列可能是 123123 ,, 132132 ,, 213213 ,, 231231 ,, 321321 。。

有有 00 个个 , 1, 1 个个 , 2, 2 个个 , 3, 3 个结点的不同二叉个结点的不同二叉树如下树如下

Page 49: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

49

数据结构

例如,具有例如,具有 44 个结点的不同二叉树个结点的不同二叉树

bn n

n

n nn n

n

C

1

1

1

1

22

( )!

! !

计算具有计算具有 nn 个结点的不同二叉树的棵数个结点的不同二叉树的棵数CatalanCatalan 函数函数

Page 50: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

50

数据结构

具有不同路径长度的二叉树具有不同路径长度的二叉树

赫夫曼树赫夫曼树 (Huffman Tree)(Huffman Tree)

路径长度 路径长度 (Path Length)(Path Length)

两个结点之间的路径长度是连接两结点的路两个结点之间的路径长度是连接两结点的路径上的分支数。树的路径长度是各叶结点到根结径上的分支数。树的路径长度是各叶结点到根结点的路径长度之和。点的路径长度之和。

Page 51: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

51

数据结构 nn 个结点的二叉树的路径长度不小于下述数列前个结点的二叉树的路径长度不小于下述数列前

nn 项的和,即项的和,即

其路径长度最小者为其路径长度最小者为

1

02 1)(log

n

i

iPL

带权路径长度 带权路径长度 ( ( Weighted Path Length, WPL )Weighted Path Length, WPL )

树的带权路径长度是树的各叶结点所带的权值与树的带权路径长度是树的各叶结点所带的权值与该结点到根的路径长度的乘积的和。该结点到根的路径长度的乘积的和。

1

0

n

iii lwWPL

1

02 1)(log

n

i

iPL

332222110

Page 52: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

52

数据结构具有不同带权路径长度的扩充二叉树具有不同带权路径长度的扩充二叉树

赫赫夫曼树夫曼树

带权路径长度达到最小的扩充二叉树即为带权路径长度达到最小的扩充二叉树即为赫赫夫曼树。夫曼树。 在在赫赫夫曼树中,权值大的结点离根最近。夫曼树中,权值大的结点离根最近。

Page 53: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

53

数据结构赫夫曼算法赫夫曼算法

(1) (1) 由给定的由给定的 nn 个权值个权值 {{ww00, , ww11, , ww22, …, , …, wwnn-1-1}} ,构,构造具有造具有 nn 棵扩充二叉树的森林棵扩充二叉树的森林 FF = { = {TT00, , TT11, , TT22, …, , …, TT

nn-1-1}} ,其中每一棵扩充二叉树,其中每一棵扩充二叉树 TTii 只有一个带有权值只有一个带有权值wwii 的根结点,其左、右子树均为空。的根结点,其左、右子树均为空。 (2) (2) 重复以下步骤重复以下步骤 , , 直到直到 FF 中仅剩下一棵树为止:中仅剩下一棵树为止: ① ① 在在 FF 中选取两棵根结点的权值最小的扩中选取两棵根结点的权值最小的扩充二叉树充二叉树 , , 做为左、右子树构造一棵新的二叉树。做为左、右子树构造一棵新的二叉树。置新的二叉树的根结点的权值为其左、右子树上置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。根结点的权值之和。 ② ② 在在 FF 中删去这两棵二叉树。中删去这两棵二叉树。 ③ ③ 把新的二叉树加入把新的二叉树加入 FF 。。

Page 54: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

54

数据结构赫赫夫曼树的构造过程夫曼树的构造过程

Page 55: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

55

数据结构赫赫夫曼编码夫曼编码

主要用途是实现数据压缩。主要用途是实现数据压缩。 设给出一段报文: 设给出一段报文: CAST CAST SAT AT A TASACAST CAST SAT AT A TASA 字符集合是 字符集合是 { C, A, S, T }{ C, A, S, T } ,各个字符出现,各个字符出现的频度的频度 (( 次数次数 )) 是 是 WW == { 2, 7, 4, 5 }{ 2, 7, 4, 5 } 。。 若给每个字符以等长编码若给每个字符以等长编码 AA : 00 T : 10 C : 01 S : 11 : 00 T : 10 C : 01 S : 11则总编码长度为 则总编码长度为 ( 2+7+4+5 ) * 2 = 36.( 2+7+4+5 ) * 2 = 36. 若按各个字符出现的概率不同而给予不等长若按各个字符出现的概率不同而给予不等长编码,可望减少总编码长度。编码,可望减少总编码长度。 因各字符出现的概率为因各字符出现的概率为 { 2/18, 7/18, 4/18, 5/1{ 2/18, 7/18, 4/18, 5/18 }8 } 。。

Page 56: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

56

数据结构化整为 化整为 { 2, 7, 4, 5 }{ 2, 7, 4, 5 } ,以它们为各叶结点上的权,以它们为各叶结点上的权

值,建立值,建立赫赫夫曼树。左分支赋 夫曼树。左分支赋 00 ,右分支赋 ,右分支赋 11 ,,得得赫赫夫曼编码夫曼编码 (( 变长编码变长编码 )) 。 。 AA : 0 T : 10 C : 110 S : 111 : 0 T : 10 C : 110 S : 111它的总编码长度:它的总编码长度: 7*1+5*2+( 2+4 )*3 = 357*1+5*2+( 2+4 )*3 = 35 。比等。比等长编码的情形要短。长编码的情形要短。 总编码长度正好等于总编码长度正好等于赫夫曼树的带权路径长赫夫曼树的带权路径长度度 WPLWPL 。。赫夫曼编码是一种无赫夫曼编码是一种无前缀编码。解码时不会前缀编码。解码时不会混淆。混淆。

霍夫曼编码树霍夫曼编码树

Page 57: 树的概念 二叉树  (Binary Tree) 二叉树的存储 二叉树遍历  (Binary Tree Traversal) 树与森林  (Tree & Forest)

57

数据结构