数据结构第11次课 树A.pptVIP

  • 3
  • 0
  • 约7.62千字
  • 约 40页
  • 2017-11-26 发布于河南
  • 举报
数据结构第11次课 树A

数据结构课程的内容 第6章 树和二叉树( Tree Binary Tree ) 6.1 树的基本知识 1. 树的定义 2. 若干术语 2. 若干术语(续) 树的表示法有几种: 图形表示法: 广义表表示法 左孩子-右兄弟表示法 树的抽象数据类型定义 3. 树的逻辑结构 (特点): 一对多(1:n),有多个直接后继(如家谱树、目录树等等),但只有一个根结点,且子树之间互不相交。 讨论3:树的链式存储方案应该怎样制定? 可规定为:从上至下、从左至右将树的结点依次存入内存。 重大缺陷:复原困难(不能唯一复原就没有实用价值)。 5. 树的运算 要明确: 1. 普通树(即多叉树)若不转化为二叉树,则运算很难实现。 2. 二叉树的运算仍然是插入、删除、修改、查找、排序等,但这些操作必须建立在对树结点能够“遍历”的基础上! (遍历——指每个结点都被访问且仅访问一次,不遗漏不重复)。 6.2 二叉树 为何要重点研究每结点最多只有两个 “叉” 的树? 二叉树的结构最简单,规律性最强; 可以证明,所有树都能转为唯一对应的二叉树,不失一般性。 1. 二叉树的定义 二叉树的抽象数据类型定义(见严教材P121-122) 2. 二叉树的性质 (3+2) 讨论3:二叉树的叶子数和度为2的结点数之间有关系吗? 满二叉树:一棵深度为k 且有2k -1个结点的二叉树。 (特点:每层都“充满”了结点) 对于两种特殊形式的二叉树(满二叉树和完全二叉树),还特别具备以下2个性质: 课堂讨论: 课堂讨论: 4. 二叉树的存储结构 讨论:不是完全二叉树怎么办? 二、链式存储结构 (1) 用二叉链表即可方便表示。 例1: 6.3 遍历二叉树和线索二叉树 例1: 例2:用二叉树表示算术表达式 遍历的算法实现:用递归形式格外简单! DLR(NODE *root ) { if (root) //非空二叉树 { printf(“%d”,root-data); //访问D DLR(root-lchild); //递归遍历左子树 DLR(root-rchild); //递归遍历右子树 } } A B E C D ^ A B ^ D ^ C ^ ^ E ^ A B E C D 有奖征集:有n个节点的二叉树采用二叉链表存储有多少空指针域?试用二叉树性质证明之! 例2: (2) 树的三叉链表表示 一、遍历二叉树(Traversing Binary Tree) 遍历定义——指按某条搜索路线遍访每个结点且不重复(又称周游)。 遍历用途——它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。 遍历方法——牢记一种约定,对每个结点的查看都是“先左后右” 。 遍历规则——— 二叉树由根、左子树、右子树构成,定义为D、 L、R D、 L、R的组合定义了六种可能的遍历方案: LDR, LRD, DLR, DRL, RDL, RLD 若限定先左后右,则有三种实现方案: DLR LDR LRD 先 (根)序遍历 中 (根)序遍历 后(根)序遍历 注:“先、中、后”的意思是指访问的结点D是先于子树出现还是后于子树出现。 先序遍历的结果是: 中序遍历的结果是: 后序遍历的结果是: A B C D E A B D E C D B E A C D E B C A 口诀: DLR—先序遍历,即先根再左再右 LDR—中序遍历,即先左再根再右 LRD—后序遍历,即先左再右再根 A B F C D E G H 先序遍历:ABCDEFGH 后序遍历:DECBHGFA 中序遍历:BDCEAFHG + * A * / E D C B 先序遍历 + * * / A B C D E 前缀表示法 中序遍历 A / B * C * D + E 中缀表示法 后序遍历 A B / C * D * E + 后缀表示法 层序遍历 + * E * D / C A B 回忆1:二叉树二叉链表结点的定义: typedef struct node *tree_pointer; typedef struct node { int data; tree_pointer left_child, right_child; } node; 则三种遍历算法可写出: 回忆2:递归的几个基本特点: long int fact(n) //求

文档评论(0)

1亿VIP精品文档

相关文档