二叉排序树相关知识

一、二叉排序树的定义

二叉排序树或者是一棵空树,又或者是一棵具有如下性质的树:

  • 若左子树不为空,则左子树上所有节点的值小于根节点
  • 若右子树不为空,则右子树上所有节点的值都大于根节点
  • 其左右子树也满足该条件

二、下面将阐述一下对于该二叉排序树的操作实现

  • 插入
  • 查找
  • 删除

(1)插入操作

若是空树,则直接进行插入,成为根节点

若不为空树,则需要保证插入以后,仍为二叉排序树

  •   若插入的元素的值小于根节点的值,则递归从根节点的左子树寻找插入的位置
  • 若插入的元素的值大于根节点的值,则递归从根节点的右子树寻找插入的位置

(2)查找指定元素:

  • 若根节点为空,则返回false
  • 若查找的元素值小于根节点的值,则递归查找左子树
  • 若查找元素值大于根节点的值,则递归查找右子树
  • 若查找元素的值等于根节点的值,则返回true

(3)插入元素:

  • 若根节点为空,则创建一个新的节点,将元素值赋予其data,再进行根节点的初始化
  • 若根节点不为空,则比较元素值与根节点值的大小,若小于根节点,则递归插入到左子树;若大于根节点,则递归插入右子树中;若等于,则说明该二叉排序树中已有该节点了,则不做任何操作。最终返回建好的二叉排序树

(4)删除元素:

  • 若根节点为空,则返回该空树
  • 若根节点不为空,也分为了几种情况

                1、要删除的元素在二叉排序树中查找不到

                2、要删除的元素在二叉排序中可以找到

                          需要删除的元素左右子树都不为空

                          需要删除的元素左子树不为空,右子树为空

                          需要删除的元素右子树不为空,左子树为空

                          需要删除的元素为叶子结点,左右子树都为空

#include<iostream>
#include<stdlib.h>
using namespace std;

typedef int Elemtype;
typedef struct BSTNode
{
    Elemtype data;
    struct BSTNode *lchild,*rchild;
}BSTNode,*BiTree;

bool Search_BST(BiTree T,Elemtype val){//查找函数,若T为空,则返回false,若值大于根节点则在右子树中查找,若值小于根节点则在左子树中查找
    if(T==NULL)
		return false;
	if(val>T->data)
		return Search_BST(T->rchild,val);
	else if(val<T->data)
		return Search_BST(T->lchild,val);
	else
		return true;

}
BiTree Insert_BST(Elemtype data,BiTree root)
 {//插入节点,若根节点为空,则新创建一个新的节点,作为根节点,返回根节点
  //若值大于根节点的值,则递归插入到右子树上
	 //若值小于根节点的值,则递归插入到左子树上
	 //等于,则说明已经存在了,不进行插入
    if(root == NULL)
    {
		root = (BiTree)malloc(sizeof(BSTNode));
        root->data = data;
        root->lchild = NULL;
        root->rchild = NULL;
        return root;
     }
     if(data < root->data)
        root->lchild = Insert_BST(data,root->lchild);
     else if(data > root->data)
        root->rchild = Insert_BST(data,root->rchild);
     else
        cout<<"该值已存在"<<endl;
     return root;
 }

//查找二叉查找树中最大、最小节点值;从根节点开始查找左儿子,
//只要存在左儿子就一直查找,终点就是最小的元素,最大的为右儿子查找终点 
BiTree Min(BiTree root)
{
    if(root == NULL)
        return NULL;
	while(root->lchild){
		root=root->lchild;
	}
        return root;
 } 

 BiTree Max(BiTree root)
 {
    if(root != NULL)                   //非递归查找 
        while(root->rchild != NULL)
            root = root->rchild;
    return root;
 }

 //删除一个结点:如果是叶结点则直接删除;如果结点有一个孩子,
 //则直接用该结点父节点连接此结点孩子结点,删除此节点;如果结点有两个孩子结点
 //则用其右子树的最小数据代替该结点的数据并递归的删除那个最小结点,因为右子树的
 //最小结点不可能有左儿子因此第二次删除比较容易
 BiTree deleteBST(BiTree root,Elemtype data)
 {
    if(root == NULL)
        return root;

    if(data < root->data)//递归删除查找元素是否在二叉排序树中
        root->lchild = deleteBST(root->lchild,data);
    else if(data > root->data)
        root->rchild = deleteBST(root->rchild,data);

    else if(root->lchild != NULL && root->rchild != NULL)//在二叉排序树中data=root->data
    {//在二叉排序树中,且左右子树均不为空,找到右子树的最小节点替换,并删除掉右子树中的最小值
        root->data = Min(root->rchild)->data;
        root->rchild = deleteBST(root->rchild,root->data);
     }
     else //左右子树中至少有一个不存在,若仅左子树存在,则用其左子树代替该节点
          //若仅右子树存在,则用其右子树代替该节点
        root=(root->lchild != NULL)?(root->lchild):(root->rchild);
        
    return root;//返回删除后的二叉排序树
  } 

//中序输出:中序遍历二叉查找树可以得到原关键字有序序列 
 void print(BiTree root)
{
    if(root!=NULL)
    {
        print(root->lchild);
        cout<<root->data<<" ";
        print(root->rchild);
    }
 } 

int main() {
    Elemtype data[7] = {45,24,53,45,12,24,90};
    int i;
	BiTree root = NULL; //二叉查找树根节点 
    for(i=0;i<N;i++)    //创建二叉查找树 
    {
        root = Insert_BST(data[i],root);
    }
    print(root);
    cout<<endl;
    root = Insert_BST(55,root);
    print(root);
    cout<<endl;
    root = deleteBST(root,24);
    print(root);
    cout<<endl;
	system("pause");
    return 0;
}

结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值