《算法笔记》第4章 入门篇(2)---算法初步 9.4 二叉查找树的定义

9.4 二叉查找树(BST)

9.4.1 二叉查找树的定义;

在这里插入图片描述

9.4.2 二叉查找树的基本操作:

1.查找操作:

在这里插入图片描述

//search函数查找二叉查找树中数据域为x的结点
//void类型函数search, 形参:node类型的指针root和int类型x
//如果是空树则查找失败,并且输出search failded;
//如果查找成功,就输出该数字
//如果x比根结点数据域小,则在左边进行搜索,反之,在右边搜索
void search(node *root,int x)
{
    if(root==NULL)   //如果是空树,则查找失败
    {
        cout << "search failded\n";
        return ;
    }
    if(x==root->data)   //查找成功,则直接输出
    {
        cout << root->data;
    }
    else if(x>roo->data)
    {
        search(root->rchild,x);
    }
    else
    {
        search(root->lchild,x);
    }
}

插入操作:

在这里插入图片描述

//insert函数将在二叉树中插入一个数据域为x的新结点
//如果为空树,则说明查找失败,就到了插入位置,然后调用一个newNode函数新建一个结点为root,并且直接返回
//如果查找成功,则直接退出循环
//同样如果值小,则往左子树走,反之,往右子树走
void insert(node *root, int x)
{
    if(root==NULL)        //如果是空树,则查找失败
    {
        root=newNode(x);    //新建一个结点
        return ;
    }
    if(root->data==x)     
    {
        return ;
    }
    else if(root->data>x)
    {
        insert(root->lchild,x);
    }
    else
    {
        insert(root->rchild,x);
    }
}

二叉树的建立:

在这里插入图片描述

//二叉查找树的建立
//函数类型:node类型的指针,形参:int类型的数组data, int类型n
//新建一个结点node类型 root,初始值为空,for循环,调用insert函数
//返回根结点

 node *Create(int data[],int n)
 {
     node *root=NULL; 
     for(int i=0; i<n; i++)
     {
         insert(root,data[i]);   //将data[0]~~data[n-1]插入到root中
     }
     return root;     //最后返回根结点
 }

在这里插入图片描述

4.二叉树的删除:

在这里插入图片描述

//寻找以root为根结点的数中的最大权值结点
//node的指针类型:函数名findMax  形参:node的指针类型:root
//while循环,循环root的右结点,直到没有右孩子
root *findMax(node *root)
{
    while(root->rchild!=NULL)
    {
        root=root->rchild;
    }
    return root;
}


//while循环一直往左边,直到为空

root *findMin(node *root)
{
    while(root->lchild!=NULL)
    {
        root=root->lchild;
    }
    return root;
}

在这里插入图片描述

//删除以root为根结点的树中权值为x的结点
//void类型函数: 函数名:deleteNode  形参:node指针类型 &root ,int类型参数 x
/*
    1.如果root为空,则直接返回NULL
    2.如果找到欲删除结点
        1.如果左孩子,右孩子均为空,则直接把root设置为NULL,直接删除
        2.如果左孩子不为空:
            1.设置node指针类型pre来存放root的先驱结点,
            2.用先驱结点pre->root来存放root->data
            3.调用deleteNode函数:第一个参数为root->lchild,第二个参数为pre->data  表示的意思是用pre->data来代替root->lchild
        3.如果右孩子不为空:
            1.设置node指针类型 next来存放后继结点
            2.用后继结点来代替更结点
            3.直接删除结点next
    3.如果根结点的数值>x,则调用deleteNode函数,其中第一个参数为左子树
    4.如果根结点的数值<x,则调用deleteNode函数,其中第一个参数为右子树
*/

void deleteNode(node *&root,int x)
{
    if(root==NULL)
        return ;
    if(root->data==x)
    {
        if(root->lchild==NULL && root->rchild==NULL)
        {
            root=NULL;
        }
        else if(root->lchild!=NULL)
        {
            node *pre=findMax(root->lchild);    //调用findMax函数,参数为root->lchild
            root->data=pre->data;
            deleteNode(root->lchild,pre->data); 
        }
        else if(root->rchild!=NULL)
        {
            node *next=findmin(root->rchild);
            root->data=next->data;
            deleteNode(root->rchild,next->data);
        }
        else if(root->data>x)
        {
            deleteNode(root->lchild,x);
        }
        else
        {
            deleteNode(root->rchild,x);
        }
    }
}

在这里插入图片描述
在这里插入图片描述

9.4.3二叉树的查找树的性质:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值