1、第7章查找7.4二叉查找树二叉查找树 二叉查找树的定义 二叉查找树的查找 二叉查找树的插入 二叉查找树的删除二叉查找树或者是一棵空树,或者是具有下列性质的二叉树: 每个结点都有一个作为搜索依据的关键字(key),所有结点的关键字互不相同。 左子树(如果非空)上所有结点的关键字都小于根结点的关键字。 右子树(如果非空)上所有结点的关键字都大于根结点的关键字。 左子树和右子树也是二叉查找树。二叉查找树( Binary Search Tree )二叉查找树 二叉查找树(BST)数据结构是具有有序特性的二叉树 BST用于维护有序结构,并可以实现更快地查找、插入和删除元素 BST主要用于解决动态查找表的
2、实现问题二叉查找树例子50752512 3528 4166 9081 9591 10054由定义可知二叉查找树的中根序遍历的顺序是一个关键字有序的序列二叉查找树?50752512 55 73 9050752512 45 66 90查找过程 在二叉查找树中查找的过程类似于折半查找 从根开始,向左或向右走直到?(例如:目标= 65)(例如:目标= 60)50752512 36 65 9045533 37 896190124512 533 37 896190二叉查找树的存储结构采用二叉链表存储#include template class BST;template class BstNode: pu
3、blicBinTreeNode /二叉查找树结点类friend class BST ;protected:Typedata;BstNode *leftChild, *rightChild;public:BstNode( ) : leftChild(NULL), rightChild(NULL) BstNode( const Type d ) : data (d), leftChild(NULL), rightChild(NULL) 二叉查找树结点类定义BstNode ( const Type d = 0, BstNode *L = NULL, BstNode *R = NULL) : data
4、 (d), leftChild (L),rightChild (R) BstNode ( ) ;二叉查找树结点类定义template class BST: public : BinaryTree private:BstNode *root; /二叉查找树的根指针Type RefValue; /数据输入停止的标志BstNode *lastfound; /最近搜索到的结点的指针void MakeEmpty( BstNode *& ptr); void Insert( const Type & x, BstNode *& ptr); void Remove( const Type & x, BstN
5、ode *& ptr); 二叉查找树类定义void PrintTree( BstNode *ptr) const;BstNode *Copy (const BstNode *ptr); BstNode *Find (const Type & x, BstNode * ptr) const; /递归函数查找值为x元素所在结点的指针BstNode *Min ( BstNode * ptr) const;/递归函数求最小元素所在结点的指针BstNode *Max ( BstNode * ptr) const; /递归函数求最大元素所在结点的指针二叉查找树类定义public:BST ( ) : roo
6、t (NULL) BST ( Type value ) : e alue(value) root (NULL) BST ( ) co t BST operator ( co t BST alue ) voi ake pty( ) ake pty(root) root NULL voi ri tTree( ) co t ri tTree( root ) int Find( const Type & x) const return Find(x, root ) != NULL; Type Min( ) return Min( root )data ;TypeMax ( ) return Max(
7、root )data ;void Insert( const Type & x ) Insert( x, root); void Remove( const Type & x ) Remove( x, root二叉查找树类定义二叉查找树查找算法思想 如果二叉树为空 查找 , 空 如果二叉树非空, 根 左子树和右子树 个 和根结点的关键字 ,相 查找 , 根结点 和根结点的关键字不相 根结点的关键字小, 左子树中 查找 根结点的关键字大, 右子树中 查找template BstNode * BST : Find(const Type & x, BstNode * ptr ) const /二叉查
8、找树的递归的搜索算法if ( ptr = NULL ) return NULL; /搜索失败else if ( x ptrdata ) /在右子树递归搜索return Find ( x, );else return ptr; /相等,搜索成功ptrleftChildptrrightChild查找算法的实现递归te plate cla Type B tNo eType BSTType : i (co t Type ) co t /二叉查找树的非递归的搜索算法B tNo eType ptr root ile(ptrcurrency1 NULL)i ( ptr ata) /在左子树递归搜索ptr p
9、trle t“il el e i ( ptr ata) /在右子树递归搜索ptr ptrrit“il el e break /相等,搜索成功retur ptr 查找算法的实现非递归二叉查找树的查找性能分析查找成功时SL fififl flflfi fi 查找失败时SL fl 13147 1615 74111二叉查找树的查找性能分析等概率情况下二叉查找树的平均查找长度为2!#!logn+c13147 1615 74111二叉查找树的查找性能分析201541576查找成功时左SL fififl fl fi右SL fifl flflflfl”fl 42 65 71 3查找算法的性能分析 退化的二叉树
10、单枝树-O(n) 平衡的差不多所有的结点都有两个孩子-O(log2n) 完全二叉树O(log2n)退化的二叉树 平衡的二叉树 完全二叉树查找序列:45,24,53,45,12,24,904553244524454553122445532412 90NULL 查找45 查找24 查找53 查找45查找12 查找24 查找9045531224455324二叉查找树插入例子二叉查找树插入算法思想 如果二叉树为空 空树中 如果二叉树非空, 根 左子树和右子树 个 和根结点的关键字 ,相 和根结点的关键字不相 根结点的关键字小, 左子树中 根结点的关键字大, 右子树中 template void BST
11、:Insert (const Type & x, BstNode * & ptr) /递归的二叉查找树插入算法if ( ptr= NULL ) /空二叉树ptr= new BstNode (x); /创 x 结点if ( ptr= NULL ) cout ut of space endl; exit ( ); else if ( x ptrdata) /在右子树插入Insert ( x, ptrrightChild);二叉查找树插入算法实现template BST : BST ( Type value ) /输入数据,建立二叉查找树的算法, RefValue是/输入结束标志Type &x; r
12、oot = NULL; RefValue = value;cin x;while ( x.key != RefValue ) Insert ( x, root ); cin x; 二叉查找树构造算法实现 一个结点 结点 。FPPLPRfpFPfpFPfpPRFPfpPL二叉查找树的删除 如果结点是子结点,可 。 如果结点有一个 子结点,可的结点的 子结点 如果结点有 个 子结点,用右子树的 小 据 或左子树的 大 据 结点的 据, 个 据 二叉查找树删除过程Data StructureSoftware College Northeastern UniversityData StructureS
13、oftware College Northeastern Universitytemplate void BST :Remove (const Type &x, BstNode * &ptr) BstNode * temp;if ( ptr != NULL )if ( x ptrdata ) Remove ( x, ptrrightChild );else if ( ptrleftChild != NULL & ptrrightChild != NULL ) temp = Min ( ptrrightChild );ptrdata = tempdata;Remove ( ptrdata, temp ); 二叉查找树删除算法el e te p ptr i ( ptrle t“il NULL ) / 右子树ptr ptrrit“il el e i ( ptrrit“il NULL )/ 左子树ptr ptrle t“il elete te p 平衡及不平衡的二叉查找树42 51 3152437642 65 71 3二叉查找树小结 二叉查找树的查找效率和树的形态有关 插入时的序列是关键字有序的易产生效率差的单支树,查找效率是O(n) 如果二叉查找树是“平衡的”,二叉查找树的操 性