230 likes | 401 Views
学习内容和重点( P227-250). 动态查找表( 二叉排序树 概念、用途,熟练掌握二叉排序树的构造和查找算法及其性能分析方法; 理解二叉排序树删除元素算法; 平衡二叉树 ( AVL 树) 概念; B - 树和 B + 树 概念). 53. 17. 78. 09. 65. 87. 15. 81. 回答问题 1( 概念). 什么是 二叉排序树?它有哪些特点?. 50. 50. 50. 50. 50. 50. 30. 30. 80. 80. 20. 40. 40. 90. 90. 35. 35. 85. 32. 88.
E N D
学习内容和重点(P227-250) • 动态查找表(二叉排序树概念、用途,熟练掌握二叉排序树的构造和查找算法及其性能分析方法;理解二叉排序树删除元素算法;平衡二叉树(AVL树) 概念; B-树和B+树 概念)
53 17 78 09 65 87 15 81 回答问题1(概念) 什么是二叉排序树?它有哪些特点?
50 50 50 50 50 50 30 30 80 80 20 40 40 90 90 35 35 85 32 88 查找关键字 == 50 , 35 , 90 , 95 回答问题2 二叉排序树的查找的过程是怎样的?
二叉排序树的查找的递归算法 通常,可取二叉链表作为二叉排序树的存储结构,则查找的递归算法如下: BiTree SearchBST (BiTree T,KeyType key){ //在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素 //若查找成功,则返回指向该数据元素结点的指针,否则返回空指针 if( (!T)||EQ(key,T->data.key)) return (T);//查找结束 else if LT(key,T->data.key) return(SearchBST(T->lchild,key)); //在左子树中继续查找 else return(SearchBST(T->rchild,key)); // 在右子树中继续查找 }//SearchBST
二叉排序树的查找的非递归算法 BinTree SearchBST( BitTree T , keytype k) { //在根指针为T的二叉排序树上查找一个关键字值为k的结点, //若查找成功返回指向该结点的指针,否则返回空指针 p = T; //指针p指向根结点,搜索从根结点开始 while ( p != NULL && p ->key != k ) { if (k <p -> key ) p = p -> lchild; else p = p -> rchild; } return ( p); }
回答问题3 二叉排序树的插入思想:可以用一个递归的过程实现,即:若二叉排序树为空,则新结点作为二叉排序树的根结点;否则,若给定结点的关键字值小于根结点关键字值,则插入在左子树上;若给定结点的关键字值大于根结点的值,则插入在右子树上。 新插入结点永远是叶子结点,为了插入到合理的位置,需要确定其双亲结点,然后根据大小关系确定是双亲的左孩子还是右孩子。 在二叉排序树中如何插入结点?
二叉排序树的插入的递归实现: void InsertBST( BitTree &T , BiTNode *P) { //在以T为根的二叉排序树上插入一个由指针p指向的新结点,其值域为插入的关键字 if ( T ==NULL) T = p ; else if ( T -> key > p->key ) InsertBST( T -> lchild , p ) ; else if (T -> key < p -> key ) InsertBST (T -> rchild , p) ; }
二叉排序树的插入的非递归实现: void InsertBST( BitTree &T , keytype k) { p = T; while ( p != NULL && p -> key!= key) { q = p; //双亲 if ( p ->key > key ) p = p -> lchild; else p = p -> rchild; } if ( p= =NULL ) { //查找没有成功 new(r); r->key=key; //创建新结点r if ( q ->key > key ) q ->lchild =r; else q -> rchild =r; } }
回答问题4 如何创建二叉排序树? 由一棵空二叉树开始,经过一系列的查找、插入操作生成一棵二叉排序树。 例:画出由数据 { 53, 78, 65, 17, 87, 09, 81, 15 }所构造的二插排序树的建树过程。
回答问题5 在二叉排序树中如何删除结点? 下面分四种情况讨论如何确保从二叉树中删除一个结点后,不会影响二叉排序树的性质: (1)若要删除的结点为叶子结点,可以直接进行删除。 (2)若要删除结点有右子树,但无左子树,可用其右子树的根结点取代要删除结点的位置。 (3)若要删除结点有左子树,但无右子树,可用其左子树的根结点取代要删除结点的位置,与步骤⑵类似。
二叉排序树的删除 (4)若要删除结点的左右子树均非空,则首先找到要删除结点的左子树中关键字值最大的结点(即子树中最右结点),利用上面的方法将该结点从左子树中删除,并用它取代要删除结点的位置,这样处理的结果一定能够保证删除结点后二叉树的性质不变。p230
回答问题6 二叉排序树的查找性能如何? 与二叉排序树的形态有关!即与查找关键字的顺序有关。如由关键字序列 1,2,3,4,5构造而得的二叉排序树和由关键字序列 3,1,2,5,4构造而得的二叉排序树的平均查找长度是大大不同的。
二叉排序树的查找性能的分析 n个结点最坏情况下是n(树的深度),平均查找长度为(n+1)/2;最好情况是与折半查找的判定树相同,其平均性能和logn等数量级.
45 24 45 24 53 45 90 24 12 回答问题7 什么是平衡二叉树(AVL树)? 如果一棵二叉排序树是平衡的,且有 n个结点,其高度可保持在O(log2n),平均查找长度也可保持在O(log2n)
回答问题8 如何使构成的二叉排序树成为平衡树?
平衡二叉树的平衡化旋转 (理解平衡树的平衡调整方法 ) 如果在一棵平衡的二叉搜索树中插入一个新结点,造成了不平衡。此时必须调整树的结构,使之平衡化,同时保持二叉排序树特性。 ★平衡化旋转有四种情况: 1.LL型 (引起最下层不平衡结点为c,所插结点为a的左孩子(L)的左孩子(L) ),平衡调整要进行右旋转。 a b b a c c
a b c 平衡二叉树的平衡化旋转 ★平衡化旋转 2.RR型 (引起最下层不平衡结点为c,所插结点为a的右孩子(R)的右孩子(R) ),平衡调整要进行左旋转. b c a
平衡二叉树的平衡化旋转 ★平衡化旋转 3.LR型 (引起最下层不平衡结点为c,所插结点为a的左孩子(L)的右孩子(R) ),平衡调整要进行左、右两次旋转.插入结点替代a,a变为其右孩子。 a c b a b c
平衡二叉树的平衡化旋转 ★平衡化旋转 4. RL型 (引起最下层不平衡结点为c,所插结点为a的右孩子(R)的左孩子(L),平衡调整要进行右、左两次旋转.插入结点替代a,a变为其左孩子。 a c b b a c
1 35 1 18 2 43 78 1 11 1 27 1 39 3 47 53 64 1 99 F F F F F F F F F F F F 回答问题9 什么是B-树?(理解概念) 例如在下述的4阶B-树中找47和23
B-树的查找过程 p239 从根结点出发,沿指针搜索结点和在结点内进行顺序(或折半)查找 两个过程交叉进行。 若查找成功,则返回指向被查关键字所在结点的指针和关键字在结点中的位置; 若查找不成功,则返回插入位置。
root sqt 59 97 15 44 59 72 97 10 15 21 37 44 51 59 63 72 85 91 97 回答问题10 什么是B+树?(理解概念)
下节课学习内容和重点 • 哈希表(掌握相关概念,掌握创建哈希表的常用方法以及解决冲突的方法)