270 likes | 409 Views
数据结构. 中央广播电视大学开放教育试点课程. 辅导教师 孙文柱. 数据结构. 第一章 绪论 第二章 线性表 第三章 稀疏矩阵和广义表 第四章 栈和队列 第五章 树和二叉树 第六章 二叉树的应用 第七章 图 第八章 查找 第九章 排序. 树和二叉树 树的概念. 第五章. 二叉树的概念. 树和二叉树的性质. 存储结构和运算. 空树. 只含根结点. 左右子树均不为空树. N. 左子树为空. 右子树为空. N. N. N. L. R. R. L. 二叉树的五种基本形态:. 结点结构 :.
E N D
数据结构 中央广播电视大学开放教育试点课程 辅导教师 孙文柱
数据结构 第一章 绪论 第二章 线性表 第三章 稀疏矩阵和广义表 第四章 栈和队列 第五章 树和二叉树 第六章 二叉树的应用 第七章 图 第八章 查找 第九章 排序
树和二叉树 树的概念 第五章 二叉树的概念 树和二叉树的性质 存储结构和运算
空树 只含根结点 左右子树均不为空树 N 左子树为空 右子树为空 N N N L R R L 二叉树的五种基本形态:
结点结构: left data right A B D C E F 二叉链表 root
先右后左的遍历算法 RLD RDL DRL 先(根)序的遍历算法 DLR 中(根)序的遍历算法 LDR 后(根)序的遍历算法 LRD
层次遍历序列: A C B D F E I G H A, B, C, D, E, F, G, H, I
前序遍历递归算法 void Preorder(BTreeNode* BT) { if(BT!=NULL) { cout<<BT->data<<' '; //D访问根结点 Preorder(BT->left); //L遍历左子树 Preorder(BT->right); //R遍历右子树 } }
由二叉树的先序和中序序列建树 先序序列 根 左子树 右子树 中序序列 左子树 根 右子树
建立二叉树 以字符串的形式定义一棵二叉 树 采用广义表表示的输入法定义 一棵二叉树
A B C E D F G 二叉链表 (孩子-兄弟)存储 A root B C D A B C E D F G E F G
树的遍历 树的遍历可有三条搜索路径: 先根(次序)遍历: 后根(次序)遍历: 按层次遍历:
A B C D E F G H I J K E B D F C G A H q GT K J I H G F E D 按层遍历树 C B A
二叉树的应用 第六章 二叉搜索树 堆 哈夫曼
二叉搜索树的定义 1.定义 2.查找算法 3.插入算法 4.删除算法 5.查找性能的分析
二叉链表作为 二叉搜索树的存储结构 struct BTreeNode { ElemType data; BTreeNode * left; BTreeNode * right; };
二叉搜索树的插入算法 • “插入”操作在查找不成功时才 进行; • 若二叉搜索树为空树,则新插入的结点为根结点;否则,新插入的结点必为一个叶子结点,其插入位置由查找过程得到。
(1)被删除的结点是叶子; (2)被删除的结点只有左子树 或者只有右子树; (3)被删除的结点既有左子树, 也有右子树。 二叉搜索树的删除算法 可分三种情况讨论:
(1)被删除的结点是叶子结点 其双亲结点相应指针域改为“空” (2)被删除的结点只有单支子树 其双亲结点的相应指针域改为 “指向被删除结点的左子树或 右子树”。
p p 右子树为空只需重接它的左子树 s=p->left; p->left =q ; delete(s); s=p->right; p->right=q ; delete(s); q q
p p 左子树为空只需重接它的右子树 s=p->left; p->left =q ; delete(s); s=p->right; p->right=q ; delete(s); q q
(3)被删除的结点有左右子树 以其前驱替代之,然后再删除该前驱结点 前驱结点 被删结点 左子树中“最右下”的结点 (左指针可能不为空)
(3)被删除的结点有左右子树 以其后继替代之,然后再删除 后继结点 右子树中“最左下”的结点 (左指针可能不为空)
堆是满足下列性质的数列{r1, r2, …,rn}: 或 (小顶堆) (大顶堆) 对于完全二叉树r2i是 ri的左孩子 r2i+1是 ri的右孩子
堆的顺序存储类型 struct Heap { ElemType heap[HeapMaxSize] ; int size; }; // HeapMaxSize 事先定义的 全局常量
两个问题: 如何“建堆”? 完全二叉树 如何“筛选”? 调整为堆
哈夫曼树 • 最优树的定义 • 如何构造最优树