Download presentation
1
树,图,查找,排序
2
习题讲解
3
填空题 若已知一棵二叉树的前序序列是BEFCGDH,中序序列是FEBGCHD,则它的后序序列必是:??????。
4
答案 F E G H D C B 法1:先由已知条件画图,再后序遍历得到结果;
法2:不画图也能快速得出后序序列,只要找到根的位置特征。由前序先确定root,由中序先确定左子树。例如,前序遍历BEFCGDH中,根结点在最前面,是B;则后序遍历中B一定在最后面。 法3:递归计算。如B在前序序列中第一,中序中在中间(可知左右子树上有哪些元素),则在后序中必为最后。如法对B的左右子树同样处理,则问题得解。
6
填空题 具有12个结点的完全二叉树有??个度为2的结点。 一棵具有257个结点的完全二叉树,它的深度为 ?? 。
一棵具有257个结点的完全二叉树,它的深度为 ?? 。 设一棵完全二叉树具有1000个结点,则此完全二叉树有 ??个叶子结点,有 ?? 个度为2的结点,有 ??个结点只有非空左子树,有 ??个结点只有非空右子树。
7
熟悉二叉树的性质 1: floor(12/2)-1; n2=n0-1 2: floor(log(n))+1; 3: ,499,1,0 叶子数=[n/2]=500 ,n2=n0-1=499。 另外,最后一结点为2i属于左叶子,右叶子是空的,所以有1个非空左子树。完全二叉树的特点决定不可能有左空右不空的情况,所以非空右子树数=0.
8
编程题1 编写递归算法,计算二叉树中叶子结点的数目。
9
思路,代码 思路:输出叶子结点比较简单,用任何一种遍历递归算法,凡是左右指针均空者,则为叶子
int LeafCount_BiTree(Bitree T) { if(!T) return 0; //空树没有叶子 else if(!T->lchild&&!T->rchild) return 1; //叶子结点 else return Leaf_Count(T->lchild)+Leaf_Count(T->rchild);//左子树的叶子数加 上右子树的叶子数 }//LeafCount_BiTree
10
编程题 2 编写算法判别给定二叉树是否为完全二叉树。 判断二叉树是否完全二叉树,是则返回1,否则返回0
11
思路 分析:该问题可以通过层序遍历的方法来解决.不管当前结点 是否有左右孩子,都入队列.这样当树为完全二叉树时,遍历时得到是一个连续的不包含空指针的序列.反之,则序列中会含有空指针.
12
代码 int IsFull_Bitree(Bitree T)//判断二叉树是否完全二叉树,是则返回1,否则返回0 {
InitQueue(Q); flag=0; EnQueue(Q,T); //建立工作队列 while(!QueueEmpty(Q)) DeQueue(Q,p); if(!p) flag=1; else if(flag) return 0; else EnQueue(Q,p->lchild); EnQueue(Q,p->rchild); //不管孩子是否为空,都入队列 } }//while return 1; }//IsFull_Bitree
13
编程题3 题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
14
思路 在遍历二元查找树时每访问到一个结点,交换它的左右子树。这种思路用递归不难实现,将遍历二元查找树的代码稍作修改就可以了。
16
编程题 4(选做) 将二叉排序树变成排序的双(单)向链表 输入一颗二叉排序树,要求仅通过调整指针使其成为排序的双向链表 (微软面试题)
17
思路 当我们到达某一结点准备调整以该结点为根结点的子树时,先调整其左子树将左子树转换成一个排好序的左子链表,再调整其右子树转换右子链表。最近链接左子链表的最右结点(左子树的最大结点)、当前结点和右子链表的最左结点(右子树的最小结点)。从树的根结点开始递归调整所有结点。
18
BSTreeNode* ConvertNode(BSTreeNode* pNode, bool asRight)
{ if(!pNode) return NULL; BSTreeNode *pLeft = NULL; BSTreeNode *pRight = NULL; // Convert the left sub-tree if(pNode->m_pLeft) pLeft = ConvertNode(pNode->m_pLeft, false); //Connect the greatest node in the left sub-tree to the current node if(pLeft) pLeft->m_pRight = pNode; pNode->m_pLeft = pLeft; } // Convert the right sub-tree if(pNode->m_pRight) pRight = ConvertNode(pNode->m_pRight, true); //Connect the least node in the right sub-tree to the current node if(pRight) pNode->m_pRight = pRight; pRight->m_pLeft = pNode; BSTreeNode *pTemp = pNode; // If the current node is the right child of its parent, //return the least node in the tree whose root is the current node if(asRight) while(pTemp->m_pLeft) pTemp = pTemp->m_pLeft; // If the current node is the left child of its parent, //return the greatest node in the tree whose root is the current node else while(pTemp->m_pRight) pTemp = pTemp->m_pRight; return pTemp;
19
图 设无向图的顶点个数为n,则该图最多有( )条边。 A)n-1 B)n(n-1)/2 C) n(n+1)/2 D)n2
A)n*n B)n(n+1) C)n/ D)n*(n-1) 有向图中一个顶点的度是该顶点的( ) A)入度 B) 出度 C) 入度与出度之和 D) (入度+出度)/2 有e条边的无向图,若用邻接表存储,表中有( )边结点。 A) e B) 2e C) e D) 2(e-1) B,D,C,B
20
实现图的广度优先搜索算法需使用的辅助数据结构为( )
A) 栈 B) 队列 C) 二叉树 D) 树 实现图的非递归深度优先搜索算法需使用的辅助数据结构为( ) A) 栈 B) 队列 C) 二叉树 D) 树 在一个有向图中所有顶点的入度之和等于出度之和的( )倍 A) 1/ B) C) D) 4 具有10个顶点的无向图至少有多少条边才能保证连通( ) A) B) C) D) 12 B,A,B,A
23
7.4有向图如图所示,试写出所有可能的拓扑序列
156234;561234;516234
24
7.5 试利用Dijkstra算法求图中顶点A到其他各顶点之间的最短路径。要求写出执行算法过程中,数组D、P和S各步的状态。
26
查找 9.3 画出对长度为17的有序表进行折半查找的判定树,并分别求其等概率时查找成功和查找不成功的ASL。
27
查找成功: ASL=1/17(1+2*2+4*3+8*4+2*5)=59/17 查找不成功: ASL=1/18(14*4+4*5)=38/9 在折半查找判定树中,查找不成功时的比较次数即是查找相应外结点时与内结点的比较次数。整个判定树代表的有序表在查找失败时的平均查找长度即为查找每个外结点的比较次数之和除以外结点的个数。
28
9.7写出判断一棵二叉树是否是二叉排序树的算法,设二叉排序树中不存在关键字值相同的结点
二叉排序树定义如下,二叉排序树或者是一棵空树;或者是具有下列性质的树。 1,若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 2,若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值 3,它的左右子树也分别为二叉排序树
29
int last=0,flag=1; int Is_BSTree(Bitree T)//判断二叉树T是否二叉排序树,是则返回1,否则返回0 { if(T->lchild&&flag) Is_BSTree(T->lchild); if(T->data<last) flag=0; //与其中序前驱相比较 last=T->data; if(T->rchild&&flag) Is_BSTree(T->rchild); return flag; }//Is_BSTree
30
编程题 折半查找算法有一个特点:如果待查找的元素在数组中有多个则返回其中任意一个,如定义数组 int a[8]={1,2,2,2,5,6,8,9};如果调用折半查找则返回3,而有些场合要求其返回第一个符合要求的数既a[1],试改下查找算法,使其符合要求。
31
int binarysearch(int number) { int mid, start = 0, end = LEN - 1;
int result = -1; while (start <= end) { mid = (start + end) / 2; if (a[mid] < number) start = mid + 1; else if (a[mid] > number) end = mid - 1; else { if (number == a[mid]) { result = mid; } return result;
32
排序习题讲解
33
排序 1.在下列排序算法中,时间复杂度不受数据初始特性影响,恒为O(n2)的是( )。 A)插入排序 B)冒泡排序 C)选择排序 D)堆排序
2.在各种排序方法中,从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为( )。 A)希尔排序 B)冒泡排序 C)插入排序 D)选择排序 3.快速排序方法在( )情况下最不利于发挥其长处。 A)要排序的数据量太大 B)要排序的数据含有多个相同值 C)要排序的数据已基本有序 D)要排序的数据个数为奇数 1.C 2.C 3. C
34
补充习题: 4..一组记录的关键码为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为
A)38,40,46,56,79,84 B)40,38,46,79,56,84 C)40,38,46,56,79,84 D)40,38,46,84,56,79 5.一组记录的关键字为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准元素得到的一次划分结果为( )。 A)38,40,46,56,79,84 B)40,38,46,79,56,84 C)40,38,46,56,79,84 D)40,38,46,84,56,79 4.C 5.C
35
补充习题: 6.用某种排序方法对线性表(25,84,21,47,15,27,68,35,20)进行排序时,元素序列的变化情况如下:
(1)20,15,21,25,47,27,68,35,84 (2)15,20,21,25,35,27,47,68,84 (3)15,20,21,25,27,35,47,68,84 则所采用的排序方法是( )。 A)选择排序 B)希尔排序 C)归并排序 D)快速排序 7.在待排序的元素序列基本有序的前提下,效率最高的排序方法是( )。 A)插入排序 B)快速排序 C)归并排序 D)选择排序 6.D 7.A
36
补充习题: 8.一组记录的排序码为(20,29,11,74,35,3,8,56),则利用堆排序方法建立的初始(小顶)堆为( )。
8.一组记录的排序码为(20,29,11,74,35,3,8,56),则利用堆排序方法建立的初始(小顶)堆为( )。 A)20,29,11,74,35,3,8,56 B)3,29,8,56,35,11,20,74 C)3,8,11,20,29,35,56,74 D)20,29,3,8,11,35,74,56 9.下列关键码序列中,属于堆的是( )。 A)(15,30,22,93,52,71) B)(15,71,30,22,93,52) C)(15,52,22,93,30,71) D)(93,30,52,22,15,71) 8.B 9.A
37
补充习题: 10.若要求尽可能快地对实数数组进行稳定的排序,则应选( )。 A)快速排序 B)堆排序 C)归并排序 D)基数排序
10.若要求尽可能快地对实数数组进行稳定的排序,则应选( )。 A)快速排序 B)堆排序 C)归并排序 D)基数排序 11.下列排序算法的时间复杂度最小的是( )。 A)冒泡排序 B)希尔排序 C)简单选择排序 D)归并排序 12.设有1000个无序的元素,希望用最快的速度挑选出其中前10个最大的元素,最好( )排序法。 A)起泡排序 B)快速排序 C)堆排序 D)基数排序 13.插入排序算法在每一趟都能选取出一个元素放在其最终的位置上。( ) A)正确 B)不正确 10.C 11.D 12.C 13.B
38
补充习题: 14.直接插入排序是不稳定的排序方法。( ) A)正确 B)不正确 15.直接插入排序的最坏情况是初始序列为( )序。
14.直接插入排序是不稳定的排序方法。( ) A)正确 B)不正确 15.直接插入排序的最坏情况是初始序列为( )序。 A)正 B)反 C)正和反 D)无 16.在各排序方法中,从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方法,称为( )。 A)希尔排序 B)归并排序 C)插入排序 D)选择排序 14.B 15.B 16.D
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.