第二次直播 清华大学 殷人昆 中央电大 徐孝凯.

Slides:



Advertisements
Similar presentations
While 迴圈 - 不知重複執行次數
Advertisements

耶和華神已掌權 主耶和華我的神 我的王 我的心要倚靠祢 凡投靠祢的必不懼怕 等候祢的必不羞愧 願祢的崇高過於諸天 祢的榮耀高過全地
热爱党、热爱祖国、热爱人民 泉州九中初二年(10)班主题班会.
34 府学胡同的文天祥祠,相传是南宋民族英雄文天祥当年遭囚禁和就义的地方,1376年明洪武九年建祠 。
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
第7章 樹與二元樹 (Trees and Binary Trees)
高考文言文的整体阅读.
高澱粉蔬菜是主食 文字取材: 蘇逸晴.
第五单元 群星闪耀 复法指导 阅读与欣赏 单元重点 1.了解传记文的基本体例与特征。
引入树 线性表、堆栈和队列都是线性结构,它们的共同特点:一对一; 计算机对弈中的一个格局可能有多个后继格局,用线性结构难以描述。
第5章 树( Tree )和二叉树 5.1 树的基本概念 5.2 二叉树 5.3 遍历二叉树和线索二叉树 5.4 树和森林
第五章 树 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
常常喜乐 赞美我主.
第三章 控制结构.
Chap4 Tree.
Chapter 5 Tree & Binary Tree
函數(一) 自訂函數、遞迴函數 綠園.
Chapter8 Binary and Other Trees
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
快速排序法 (Quick Sort).
1、基本概念 2、插入排序 3、交换排序 4、选择排序 5、归并排序 6、基数排序 7、外部排序
数 据 结 构 Ch.6 树 计 算 机 学 院 肖明军
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
哈夫曼编码.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
6 使用者函數 6.1 函數定義 宣告函數 呼叫函數 呼叫多個函數 6-6
数据结构与算法
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
第二章 程序的灵魂--算法.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
二叉树和其他树 (Binary and other trees)
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
计算机算法设计与分析(第3版) 王晓东 编著 电子工业出版社.
Tree & Binary Tree.
第2章 C++流程控制语句 if 语句 switch语句 for语句 while语句 do - while语句 break语句
第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析.
二叉树的遍历.
C++大学基础教程 第3章 C++控制语句 北京科技大学 信息基础科学系.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
辅导课程八.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
程式結構&語法.
第1章 绪论 2019/4/16.
第三章 C++的语句和简单的程序设计 主要内容:
top b top a a top 空栈 a 进栈 b 进栈 top top e e e top d d d c c c b b b a a
資料結構與演算法 第一章 基本概念 徐熊健 資料結構與演算法 徐熊健.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
C 语言程序设计 程序的循环结构 电大崇信县工作站 梁海亮.
第2章 算法与C语言程序 程序 (1)数据的描述:数据的类型和组织形式(数据结构) (2)操作的描述:操作步骤(算法) 沃思指出:
第7章 樹與二元樹(Trees and Binary Trees)
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
資料結構簡介 綠園.
累堆排序法 (Heap Sort).
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
遞迴 Recursion.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
有理数的乘方(二).
Chapter 2 Entity-Relationship Model
迴圈(重複性結構) for while do while.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
判斷(選擇性敘述) if if else else if 條件運算子.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Presentation transcript:

第二次直播 清华大学 殷人昆 中央电大 徐孝凯

本次要讲的问题 第五章 递归与广义表 第六章 树与二叉树

第五章 递归与广义表 学习目的 掌握递归问题求解方法 运用递归方法求解应用问题

需要掌握的知识点 递归概念: 什么是递归? 递归的函数定义 递归的数据结构 递归问题的解法 链表是递归的数据结构 可用递归过程求解有关链表的问题

递归实现时栈的应用 递归求解思路 递归过程与递归工作栈:递归过程实现的机制及递归工作栈的引用 递归的分层(树形)表示 :递归树 递归深度(递归树的深度)与递归工作栈的关系 单向递归与尾递归的迭代实现

广义表 广义表定义 广义表长度、深度、表头、表尾 广义表的表示及操作 用图形表示广义表的存储结构 广义表的递归算法

递归举例 求解斐波那契数列的递归算法 long Fib ( long n ) { if ( n <= 1 ) return n; else return Fib (n-1) + Fib (n-2); }

考虑使用递归算法求解的思路 递归算法的一般形式 void p ( 参数表 ) if ( 递归结束条件) 可直接求解步骤; 基本项 else p ( 较小的参数 ); 递归项

例 求数组 A 中 n 个整数的和 return A[n] + sum(n-1); //求n-1个整数的和, 再加A[n] int sum ( int n ) { if ( n == 0 ) return A[0]; //直接求解 else return A[n] + sum(n-1); //求n-1个整数的和, 再加A[n] }

递归与回溯 常用于搜索过程 例 n皇后问题 在 n 行 n 列的国际象棋棋盘上,若两个皇后位于同一行、同一列、同一对角线上,则称为它们为互相攻击。n皇后问题是指找到这 n 个皇后的互不攻击的布局。

    k = n+i-j-1 0#次对角线 2#次对角线 1#次对角线 4#次对角线 3#次对角线 0 1 2 3 6#次对角线 5#次对角线 0 1 2 3 1 2 3    0#主对角线 2#主对角线 4#主对角线 6#主对角线 1#主对角线 3#主对角线 5#主对角线  k = i+j

解题思路 安放第 i 行皇后时,需要在列的方向从 1 到 n 试探 ( j = 1, …, n ) 在第 j 列安放一个皇后:

设置 4 个数组 col [n] :col[i] 标识第 i 列是否安放了皇后 md[2n-1] : md[k] 标识第 k 条主对角线是否安放了皇后 sd[2n-1] : sd[k] 标识第 k 条次对角线是否安放了皇后 g[n] : g[i] 记录第 i 行皇后在第几列

void green( int i ) { for ( int j = 1; j <= n; j++ ) { if ( 第 i 行第 j 列没有攻击 ) { 在第 i 行第 j 列安放皇后; if ( i == n ) 输出一个布局; else green ( i+1 ); } 撤消第 i 行第 j 列的皇后;

算法求精 void green( int i ) { for ( int j = 1; j <= n; j++ ) { if ( !col[j] && !md[n+i-j-1] && !sd[i+j] ) { /*第 i 行第 j 列没有攻击 */ col[j] = md[n+i-j-1] = sd[i+j] = 1; g[i] = j; /*在第 i 行第 j 列安放皇后*/

cout << g[j] << ‘,’; cout << endl; } if ( i == n ) { /*输出一个布局*/ for ( j = 0; j <= n; j++ ) cout << g[j] << ‘,’; cout << endl; } else green ( i+1 ); col[j] = md[n+i-j-1] = sd[i+j] = 0; g[i] = 0; /*撤消第i行第j列的皇后*/

第六章 树与二叉树 学习目的 理解树与二叉树的结构特点 掌握树与二叉树的特定应用(如堆、霍夫曼树等)

需要掌握的知识点 树 树的定义、树的基本运算 树的分层定义是递归的 树中结点个数与高度的关系 二叉树 二叉树定义、基本运算 二叉树性质 树 树的定义、树的基本运算 树的分层定义是递归的 树中结点个数与高度的关系 二叉树 二叉树定义、基本运算 二叉树性质 二叉树结点个数与高度的关系 不同二叉树的棵数

完全二叉树的顺序存储 完全二叉树的双亲、子女和兄弟的位置 二叉树的前序 · 中序 · 后序 · 层次遍历 前序 · 中序 · 后序的线索化二叉树中前驱与后继的查找方法 应用二叉树遍历的递归算法

霍夫曼树 霍夫曼树的构造方法 霍夫曼编码 带权路径长度的计算 树的存储 树的广义表表示与双亲表示 树与二叉树的对应关系 树的先根 · 后根 · 层次遍历

堆 堆的定义、堆的插入与删除 形成堆时用到的向下调整算法 形成堆时比较次数的上界估计 堆插入时用到的向上调整算法 堆的插入与删除算法

【例1】在结点个数为n (n > 1)的各棵树中,高度最小的树的高度是多少?它有多少叶结点?多少分支结点?高度最大的树的高度是多少?它有多少叶结点?多少分支结点?

【解答】结点个数为 n 时, 高度最小的树的高度为 1, 有 2层;有 n-1 个叶结点,1 个分支结点;

【例2】已知一棵二叉树的前序遍历的结果序列是 ABECDFGHIJ 中序遍历的结果序列是 EBCDAFHIGJ 试画出这棵二叉树。

【解答】前序序列 ABECDFGHIJ,中序序列 EBCDAFHIGJ 时:

前序序列 ABECDFGHIJ 中序序列 EBCDAFHIGJ A A B F B F E C G E C G D H J D HI J I

【例3】若用二叉链表作为二叉树的存储表示,试针对以下问题编写递归算法: (1) 统计二叉树中叶结点个数。 (2) 以二叉树为参数, 交换每个结点的左子女和右子女。

【解答】 (1) 定义二叉树结构 template <class Type> class BinaryTree; //二叉树 class BinTreeNode //二叉树结点 leftChild data rightChild

(2) 统计二叉树中叶结点个数 3 2 1 1 1 1 1

template <class Type> int leaf ( BinTreeNode<Type>* t ) { if ( !t ) return 0; else if ( !t→leftChild && !t→rightChild ) return 1; else return leaf ( t→leftChild ) + leaf ( t→rightChild ); }

(3) 交换每个结点的左子女和右子女

template <class Type> void exchange ( BinTreeNode<Type>* t ) { BinTreeNode<Type>* p; if ( t→leftChild || t→rightChild ) { //非叶结点,交换左、右子女 p = t→leftChild; t→leftChild = t→rightChild ; t→rightChild = p;

exchange ( t→leftChild ); exchange ( t→rightChild ); }

【例4】假定用于通信的电文仅由 8 个字母 c1, c2, c3, c4, c5, c6, c7, c8 组成, 各字母在电文中出现的频率分别为 5, 25, 3, 6, 10, 11, 36, 4。试为这 8 个字母设计不等长 Huffman 编码, 并给出该电文的总码数。

【解答】

则Huffman编码为 电文总码数为 4 * 5 + 2 * 25 + 4 * 3 + 4 * 6 + c1 c2 c3 c4 c5 c6 c7 c8 1110 00 1100 1111 100 101 01 1101 电文总码数为 4 * 5 + 2 * 25 + 4 * 3 + 4 * 6 + 3 * 10 + 3 * 11 + 2 * 36 + 4 * 4 = 257

【例5】下面是对二叉树进行中序遍历的递归算法。 template <class Type> void inorder ( BinTreeNode<Type>* t ) { if ( t ) { inorder ( t→leftChild ); cout << t→data; inorder ( t→rightChild ); }

将算法中的第二个递归语句消去, 这相当于尾递归,可用循环实现 template <class Type> void inorder ( BinTreeNode<Type>* t ) { while ( t ) { inorder ( t→leftChild ); cout << t→data; t = t→rightChild; }

接着, 将算法中的第一个递归语句消去, 这必须借助于栈, 记忆回退的路径. template <class Type> void InOrder ( BinTreeNode<Type>* t ) { StackType S; BinTreeNode<Type>* p = t; S.makeEmpty( ); //初始化

do{ while ( p ) { S.Push(p); p = p→leftChild; } if ( !S.IsEmpty( ) ) { p = S.getTop( ); S.Pop( ); cout << p→data << endl; p = p→rightChild; } } while ( p || !S.IsEmpty( ) );

下一次直播时间:5月10号 同学们:再见!