二叉树节点和设计

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);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值