数据结构-二叉查找树

性质:

对于树中的每一个结点,它的左子树的所有结点的值都小于该节点的值,它的右子树的所有结点的值都大于该节点的值。

方法:

contains
在树T中是否有项为X的结点。

  • 如果T为空,返回false。
  • 如果T不为空,X就是T的根节点,返回true。
  • 如果T不为空,X不是T的根节点,就根据X与根节点的关系,对左子树或者是右子树进行递归操作。
bool contains(const Comparable &x,BinaryNode *t) const 
{
if(t==NULL) return false;//树是空集
else if(x<t->element) return contains(x,t->left);//目标值小于根节点的元素值
else if(x>t->element) return contains(x,t->right);//目标值大于根节点的元素值
else return true;//目标值就是根节点的元素值
}

findMin和findMax
返回指向树中最大元和最小元的指针。
最小元是树最左边的叶子结点,最大元是树最右边的叶子结点。

BinaryNode* findMin(BinaryNode *t) const
{
if(t==NULL) return NULL;//树为空集
else if(t->left==NULL) return t;//树没有左子树,最小元便是根节点
else return findMin(t->left);//最小元在左子树中
}

BinaryNode* findMax(BinaryNode *t) const
{
if(t==NULL) return NULL;//树为空集
else if(t->right==NULL) return t;//树没有右子树,最大元便是根节点
else return findMax(t->right);//最大元在右子树中
}

insert
在树T中插入X

void insert(const Comparable &x,BinaryNode * &t)
{
if(t==NULL) t=new BinaryNode(x,NULL,NULL);//找到合适的位置,t为根节点的时候,就是创建一个新的根节点,t指向这个根节点,t为某个结点的某个儿子时候,创建新节点,作为该结点的儿子,t是根节点,指向儿子
else if(x<t->element) return insert(x,t->left);//x应该插入到左子树中的某处
else if(x>t->element) return insert(x,t->right);//x应该插入到右子树的某处
else ;//刚刚好x等于t的元素值,如果有其他次数元素,可以对次数++,这里没有也就没有操作,x已经存在t中
}

remove
从树T中删除X。

void remove(conts Comparable &x,BinaryNode * & t)
{
if (t==NULL) return;//树为空或者没有x元素
else if (x<t->element) remove(x,t->left);//x元素在左子树中
else if (x>t->element) remove(x,t->right);//x元素在右子树中
else if (t->left!=NULL && t->right!=NULL) //x元素已经找到就是t,t有两个儿子
{
//首先将t的值换成t的右子树的最小元的值,再将最小元从右子树中删除
t->element=findMin(t->right)->element;
remove(t->element,t->right);
}
else//x元素已经找到就是t,t有一个或者没有儿子
{
//首先存储指向t的指针,修改指向t的指针去指向t的儿子结点或者为NULL,修改之后将指向t的指针删除。
BinaryNode* oldNode=t;
t=(t->left!=NULL)?t->left:t->right;
delet oldNode;
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值