1.27k likes | 1.48k Views
第六章 树和二叉树. 树的定义和基本术语 树的存储 二叉树 遍历二叉树和线索二叉树 树、森林与二叉树的转换 赫夫曼树及其应用. 树的定义和基本术语. 树的类型定义. 数据对象 D : D 是具有相同特性的数据元素的集合。 数据关系 R : 若 D 为空集,则称为空树 。 否则 : 在 D 中存在唯一的称为根的数据元素 root ; 当 n>1 时,其余结点可分为 m (m>0) 个互不相交的有限集 T 1 , T 2 , …, T m ,其中每一棵子集本身又是一棵符合本定义的树,称为根 root 的子树。. A. C. B. D. E. F.
E N D
树的定义和基本术语 树的存储 二叉树 遍历二叉树和线索二叉树 树、森林与二叉树的转换 赫夫曼树及其应用
树的类型定义 数据对象 D: D是具有相同特性的数据元素的集合。 数据关系 R: 若D为空集,则称为空树 。 否则: 在D中存在唯一的称为根的数据元素root; 当n>1时,其余结点可分为m (m>0)个互不相交的有限集T1, T2, …, Tm,其中每一棵子集本身又是一棵符合本定义的树,称为根root的子树。
A C B D E F G H I J K A( B(E, F),C(G),D(H(k), I, J)) T1 T2 T3 树根 根 子树
树的逻辑特征: 树中只有根结点无直接前驱 除了根结点,其余结点都有且仅有一个直接前驱 树中每个结点可以有零个或多个直接后继
A B C D A B C D 树的表示法 1.分支图表示法 2.嵌套集合表示法 3.广义表表示法 (A(B(D),C))
基本术语 结点 结点的度 叶子结点或终端结点 分支结点或非终端结点 树的度 孩子和双亲 兄弟 祖先和子孙 结点的层次 堂兄弟 树的深度
A C D B E F G H I J K L M 基本术语 结点 结点的度 叶结点 分支结点 树的度
A C D B E F G H I J K L M 基本术语 兄弟 祖先和子孙 孩子和双亲 堂兄弟
A C D B E F G H I J K L M 基本术语 1层 2层 height = 4 3层 4层 结点的层次 树的深度
基本术语 有序树和无序树:如果将树中结点的各子树看成从左至右是有次序的,则称该树为有序树,否则称为无序树。 森林:森林是m棵互不相交的树的集合。
树的三种存储结构 • 双亲表示法 • 孩子链表表示法 • 二叉链表表示法
A C B D E F G H I J dataparent K 双亲表示法 结点结构: -1 0 0 0 1 1 2 3 3 3 7
双亲表示法的类型描述 #define MAX_TREE_SIZE 100 typedef struct PTNode { Elem data; int parent; // 双亲位置域 } PTNode; typedef struct { PTNode nodes[MAX_TREE_SIZE]; int r, n; // 根结点的位置和结点个数 } PTree;
孩子链表表示法: 双亲结点结构 data firstchild 孩子结点结构: child next
A C B D E F G H I J K 孩子链表表示法: data firstchild ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
孩子链表类型描述: #define MAX_TREE_SIZE 100 typedef struct CTNode { int child; struct CTNode *next; } *ChildPtr;
typedef struct { Elemtype data; ChildPtr firstchild; // 孩子链的头指针 } CTBox; typedef struct { CTBox nodes[MAX_TREE_SIZE]; int n, r; // 结点数和根结点的位置 } CTree;
左孩子右兄弟表示法 firstchild data nextsibling 结点结构如下: 指针域 数据域 指针域 存放下一个兄弟的地址 存放第一个孩子的地址
root A A B B C D C E D E F F G G
左孩子右兄弟表示法类型描述: typedef struct CSNode{ Elem data; struct CSNode *firstchild, *nextsibling; } CSNode, *CSTree;
二叉树 • 二叉树的类型定义 • 二叉树的性质 • 二叉树的存储
二叉树的类型定义 二叉树是n(n≥0)个结点的有限集,它或者为空,或者由一个根结点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组成。 二叉树的特点: 二叉树的度小于等于2 二叉树是一棵有序树
二叉树的五种形态: φ (a)空树 (b)仅有根 (c) 右子树空 (e) 左子树空 (d) 左、右子树均在
二叉树的性质 性质1在二叉树的第i层上至多有 2i-1个结点。 性质2深度为k的二叉树至多有 2k-1个结点(k1)。 性质3对任何一棵二叉树T, 如果其叶结点数为 n0, 度为2的结点数为 n2,则n0=n2+1。
满二叉树:深度为k,且有2k-1个结点的二叉树。满二叉树:深度为k,且有2k-1个结点的二叉树。 完全二叉树:深度为k,结点数为n的二叉树,当且仅当每个结点的编号都与相同深度的满二叉树中从1到n的结点一一对应时,称为完全二叉树。 两类特殊形态的二叉树
1 2 3 1 4 5 2 3 4 5 6 7 6 7 8 9 10 11 12 13 14 15 1 1 2 3 2 3 4 5 6 7 6 4 5 8 9 10 11 12
二叉树的性质 性质4具有 n (n 0) 个结点的完全二叉树的深度为log2(n) +1。 性质5如果对一棵有n个结点的完全二叉树的结点按层次顺序编号,则对任一结点有: 如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点 i/2 如果2i>n,则结点i无左孩子;否则其左孩子是结点2i 如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1
在一棵度为m树中,度为1的结点数为n1,度为2的结点数为n2,……,度为m的结点数为nm,则该数中含有多少个叶子结点?有多少个非终端结点?
解:设度为0的结点(即终端结点)数目为n0,树中的分支数为B,树中总的结点数为N,则有:解:设度为0的结点(即终端结点)数目为n0,树中的分支数为B,树中总的结点数为N,则有: (1)从结点的度考虑:N= n0+ n1+ n2+……+nm (2)从分支数目考虑:一棵树中只有一个根结点,其他的均为孩子结点,而孩子结点可以由分支数得到。所以有: N=B+1=0×n0+1×n1+2×n2+…+m×nm+1 由以上两式,可得 n0+ n1+ n2+……+nm =0×n0+1×n1+2×n2+…+m×nm+1 从而可导出叶子结点的数目为: n0=0×n1+1×n2+…+(m-1)×nm+1=1+ 从而可以得到非终端结点的数目为 N- n0= n1+ n2+……+nm=
二叉树的顺序存储表示 按满二叉树的结点层次编号,用一组地址连续的存储单元,依编号存放二叉树中的数据元素,结点的相对位置蕴含着结点之间的关系。
A B C D E F G 1 3 2 7 5 6 4 8 10 11 9
二叉树的二叉链表存储表示 结点结构 左指针域 右指针域 数据域
bt A B C D E F G H ^ ^ ^ ^ ^ ^ ^ ^ ^
二叉链表的类型描述 typedef char TElemType; typedef struct BiNode{ TElemType data; struct BiNode *lchild; struct BiNode *rchild; }BiTNode,*BiTree;
遍历二叉树和线索二叉树 • 二叉树的遍历及递归算法 • 二叉树遍历算法的应用 • 二叉树遍历算法非递归实现 • 二叉树的线索化 • 线索二叉树的遍历
遍历二叉树定义: 按某条搜索路径巡访二叉树中的结点,使得每个结点均被访问,且仅被访问一次。
D L R 先序遍历 中序遍历 后续遍历 LDR、LRD、DLR RDL、RLD、DRL
先序遍历二叉树 若二叉树为空,则空操作;否则 访问根结点 先序遍历左子树 先序遍历右子树
A C B D A D L R D L R > > > B C D L R > > D 先序遍历: D L R 先序遍历序列:A B D C
中序遍历二叉树 若二叉树为空,则空操作;否则 中序遍历左子树 访问根结点 中序遍历右子树
A C B D B L D R L D R > > > A C L D R > > D 中序遍历: L D R 中序遍历序列: B D A C
后序遍历二叉树 若二叉树为空,则空操作;否则 后序遍历左子树 后序遍历右子树 访问根结点
A C B D L R D L R D B L R D > > > A C > > D 后序遍历: L R D 后序遍历序列:D B C A
- + / a * f e b - c d e - c / d 先序遍历: b f - + a * 中序遍历: a + b * c - d - / f e 后序遍历: a b c d - * + e f / -
A B C D E F G H 先序序列: ABDFCEGH 中序序列: BFDAGEHC 后序序列: FDBGHECA
A B C D E F G I J K M N P L H
思考1: 满足下列条件的所有二叉树: 1、先序序列和中序序列相同 2、中序序列和后序序列相同 3、先序序列和后序序列相同
思考2: 1、怎样由二叉树的先序序列和中序序列构造一颗二叉树? 2、怎样由二叉树的后序序列和中序序列构造一颗二叉树?