1 / 126

第六章 树和二叉树

第六章 树和二叉树. 树的定义和基本术语 树的存储 二叉树 遍历二叉树和线索二叉树 树、森林与二叉树的转换 赫夫曼树及其应用. 树的定义和基本术语. 树的类型定义. 数据对象 D : D 是具有相同特性的数据元素的集合。 数据关系 R : 若 D 为空集,则称为空树 。 否则 : 在 D 中存在唯一的称为根的数据元素 root ; 当 n>1 时,其余结点可分为 m (m>0) 个互不相交的有限集 T 1 , T 2 , …, T m ,其中每一棵子集本身又是一棵符合本定义的树,称为根 root 的子树。. A. C. B. D. E. F.

baris
Télécharger la présentation

第六章 树和二叉树

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第六章 树和二叉树

  2. 树的定义和基本术语 树的存储 二叉树 遍历二叉树和线索二叉树 树、森林与二叉树的转换 赫夫曼树及其应用

  3. 树的定义和基本术语

  4. 树的类型定义 数据对象 D: D是具有相同特性的数据元素的集合。 数据关系 R: 若D为空集,则称为空树 。 否则: 在D中存在唯一的称为根的数据元素root; 当n>1时,其余结点可分为m (m>0)个互不相交的有限集T1, T2, …, Tm,其中每一棵子集本身又是一棵符合本定义的树,称为根root的子树。

  5. 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 树根 根 子树

  6. 树的逻辑特征: 树中只有根结点无直接前驱 除了根结点,其余结点都有且仅有一个直接前驱 树中每个结点可以有零个或多个直接后继

  7. A B C D A B C D 树的表示法 1.分支图表示法 2.嵌套集合表示法 3.广义表表示法 (A(B(D),C))

  8. 基本术语 结点 结点的度 叶子结点或终端结点 分支结点或非终端结点 树的度 孩子和双亲 兄弟 祖先和子孙 结点的层次 堂兄弟 树的深度

  9. A C D B E F G H I J K L M 基本术语 结点 结点的度 叶结点 分支结点 树的度

  10. A C D B E F G H I J K L M 基本术语 兄弟 祖先和子孙 孩子和双亲 堂兄弟

  11. A C D B E F G H I J K L M 基本术语 1层 2层 height = 4 3层 4层 结点的层次 树的深度

  12. 基本术语 有序树和无序树:如果将树中结点的各子树看成从左至右是有次序的,则称该树为有序树,否则称为无序树。 森林:森林是m棵互不相交的树的集合。

  13. 树的三种存储结构 • 双亲表示法 • 孩子链表表示法 • 二叉链表表示法

  14. A C B D E F G H I J dataparent K 双亲表示法 结点结构: -1 0 0 0 1 1 2 3 3 3 7

  15. 双亲表示法的类型描述 #define MAX_TREE_SIZE 100 typedef struct PTNode { Elem data; int parent; // 双亲位置域 } PTNode; typedef struct { PTNode nodes[MAX_TREE_SIZE]; int r, n; // 根结点的位置和结点个数 } PTree;

  16. 孩子链表表示法: 双亲结点结构 data firstchild 孩子结点结构: child next

  17. A C B D E F G H I J K 孩子链表表示法: data firstchild ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

  18. 孩子链表类型描述: #define MAX_TREE_SIZE 100 typedef struct CTNode { int child; struct CTNode *next; } *ChildPtr;

  19. typedef struct { Elemtype data; ChildPtr firstchild; // 孩子链的头指针 } CTBox; typedef struct { CTBox nodes[MAX_TREE_SIZE]; int n, r; // 结点数和根结点的位置 } CTree;

  20. 左孩子右兄弟表示法 firstchild data nextsibling 结点结构如下: 指针域 数据域 指针域 存放下一个兄弟的地址 存放第一个孩子的地址

  21. root A A B B C D C E D E F F G G

  22. 左孩子右兄弟表示法类型描述: typedef struct CSNode{ Elem data; struct CSNode *firstchild, *nextsibling; } CSNode, *CSTree;

  23. 二叉树 • 二叉树的类型定义 • 二叉树的性质 • 二叉树的存储

  24. 二叉树的类型定义 二叉树是n(n≥0)个结点的有限集,它或者为空,或者由一个根结点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组成。 二叉树的特点: 二叉树的度小于等于2 二叉树是一棵有序树

  25. 二叉树的五种形态: φ (a)空树 (b)仅有根 (c) 右子树空 (e) 左子树空 (d) 左、右子树均在

  26. 二叉树的性质 性质1在二叉树的第i层上至多有 2i-1个结点。 性质2深度为k的二叉树至多有 2k-1个结点(k1)。 性质3对任何一棵二叉树T, 如果其叶结点数为 n0, 度为2的结点数为 n2,则n0=n2+1。

  27. 满二叉树:深度为k,且有2k-1个结点的二叉树。满二叉树:深度为k,且有2k-1个结点的二叉树。 完全二叉树:深度为k,结点数为n的二叉树,当且仅当每个结点的编号都与相同深度的满二叉树中从1到n的结点一一对应时,称为完全二叉树。 两类特殊形态的二叉树

  28. 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

  29. 二叉树的性质 性质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

  30. 在一棵度为m树中,度为1的结点数为n1,度为2的结点数为n2,……,度为m的结点数为nm,则该数中含有多少个叶子结点?有多少个非终端结点?

  31. 解:设度为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=

  32. 二叉树的顺序存储表示 按满二叉树的结点层次编号,用一组地址连续的存储单元,依编号存放二叉树中的数据元素,结点的相对位置蕴含着结点之间的关系。

  33. A B C D E F G 1 3 2 7 5 6 4 8 10 11 9

  34. 二叉树的二叉链表存储表示 结点结构 左指针域 右指针域 数据域

  35. bt A B C D E F G H ^ ^ ^ ^ ^ ^ ^ ^ ^

  36. 二叉链表的类型描述 typedef char TElemType; typedef struct BiNode{ TElemType data; struct BiNode *lchild; struct BiNode *rchild; }BiTNode,*BiTree;

  37. 遍历二叉树和线索二叉树 • 二叉树的遍历及递归算法 • 二叉树遍历算法的应用 • 二叉树遍历算法非递归实现 • 二叉树的线索化 • 线索二叉树的遍历

  38. 遍历二叉树定义: 按某条搜索路径巡访二叉树中的结点,使得每个结点均被访问,且仅被访问一次。

  39. D L R 先序遍历 中序遍历 后续遍历 LDR、LRD、DLR RDL、RLD、DRL

  40. 先序遍历二叉树 若二叉树为空,则空操作;否则 访问根结点 先序遍历左子树 先序遍历右子树

  41. A C B D A D L R D L R > > > B C D L R > > D 先序遍历: D L R 先序遍历序列:A B D C

  42. 中序遍历二叉树 若二叉树为空,则空操作;否则 中序遍历左子树 访问根结点 中序遍历右子树

  43. A C B D B L D R L D R > > > A C L D R > > D 中序遍历: L D R 中序遍历序列: B D A C

  44. 后序遍历二叉树 若二叉树为空,则空操作;否则 后序遍历左子树 后序遍历右子树 访问根结点

  45. A C B D L R D L R D B L R D > > > A C > > D 后序遍历: L R D 后序遍历序列:D B C A

  46. - + / a * f e b - c d e - c / d 先序遍历: b f - + a * 中序遍历: a + b * c - d - / f e 后序遍历: a b c d - * + e f / -

  47. A B C D E F G H 先序序列: ABDFCEGH 中序序列: BFDAGEHC 后序序列: FDBGHECA

  48. A B C D E F G I J K M N P L H

  49. 思考1: 满足下列条件的所有二叉树: 1、先序序列和中序序列相同 2、中序序列和后序序列相同 3、先序序列和后序序列相同

  50. 思考2: 1、怎样由二叉树的先序序列和中序序列构造一颗二叉树? 2、怎样由二叉树的后序序列和中序序列构造一颗二叉树?

More Related