1 思维导图
2 设计思路
2.1 抽象类
2.2.1 Node抽象类
私有部分:定义节点元素值
公有部分:
getelemnt()方法:获取节点元素值
setelemnt() 方法:给节点元素赋值
Node() 方法:构造函数
2.1.2 BinaryTree抽象类
公有部分:
contains( ): 检查树中是否有某个值
isEmpty():检查树是否为空
printTree() :打印树
makeEmpty() :清空树
insert() :向树中插入元素
remove() :删除书中的某个元素
findMin() :找到树中值最小的节点
findMax() :找到树中值最大的节点
该抽象类声明了一些纯虚函数,表示二叉树类必须拥有的功能,下面的三个实现类中都有这些函数。
3 实现类
3.1 BinarySearchTree
先让二叉搜索树类继承二叉树抽象类,在外部类的私有部分中,定义二叉搜索树节点类,并让其继承节点抽象类。外部类的公有部分定义了构造函数、析构函数和BinaryTree抽象类中的所有函数。
在二叉搜索树节点类中,left和right指针为私有属性。公有部分定义了一些重写的函数,getleft() 获取指向左孩子节点的指针,getright() 获取指向右孩子节点的指针,setleft()为指向左孩子节点的指针赋值,setright()为指向右孩子节点的指针赋值,在有参构造函数中,节点赋值操作使用了Node抽象类的构造函数。
3.2 AvlTree
继承方法与BinarySearchTree相同,外部类的公有部分除了必须具备的函数,还有 height( ),max( ), rotateWithLeftChild( ),rotateWithRightChild( ),doubleWithLeftChild( ),doubleWithRightChild( )等函数。
并且AvlNode的私有属性含有树高height,节点类的公有部分比BinarySearchTree多了getheight()和setheight()函数。
上述增加的属性与功能用来保证在对AvlTree进行修改时能保证其始终保持平衡。
3.3 SplayTree
继承方法与前两者相同相同,外部类的公有部分除了必须具备的函数,还有 reclaimMemory( ),rotateWithLeftChild( ),rotateWithRightChild( ),splay( ) 等函数,用来实现伸展树的特定功能。其余结构与BinarySearchTree基本相同。
4 实现方法
在三个实现类的节点中,共有的函数是getleft() ,getright() ,setleft(),setright()
可利用getleft() 或getright()获取指向左孩子或右孩子节点的指针,例如 remove()函数中,
if( x < t->element ) 语句可替换为if( x < t->getelement() )
使用setleft()或setright()可为指针赋值,如t->element = findMin( t->right )->element 可替换为
t->setelement(findMin( t->getright() )->getelement())
在AvlTreeNode中,还有getheight()和setheight()函数,可以获取树高或修改树高。例如rotateWithLeftChild( )函数中,k1->height = max( height( k1->left ), k2->height ) + 1;语句可替换为
k1->setheight(max( height( k1->getleft() ), k2->getheight() ) + 1);