数据结构---递归实现二叉排序树

本文介绍了如何使用递归实现二叉排序树。在二叉排序树中,查找是通过比较关键码逐步缩小范围的过程。删除节点时,必须保持二叉树的排序性质,需要根据子树情况调整。文中提供了创建、删除节点以及遍历二叉树的代码和测试结果。
摘要由CSDN通过智能技术生成

二叉排序树的实现

 二叉排序树(简称BST)又称二叉查找(搜索)树,其定义为:二叉排序树或者是空树或者是满足如下性质的二叉树:  

  1.若它的左子树不为空,则左子树上所有的结点的值都小于根结点的值
     2.若它的右子树不为空,则右子树上的所有节点的值都大于跟结点 的值
      3.它的左右子树也分别为二叉搜索树

  二叉排序树还有一个重要的性质:中序遍历二叉排序树所得到的中序序列是一个递增的有序数列

搜索二叉树

在讨论二叉树之前,先得定义结点:
每个结点中包含自己本身的关键码,还包含他的左孩子结点与右孩子结点

typedef char SearchTreeType;

typedef struct SearchTreeNode
{
    SearchTreeType key;//关键码
    SearchTreeNode *lchild;
    SearchTreeNode *rchild;
}SearchTreeNode;
  向二叉树中插入元素,插入元素后要保证得到的二叉树还得保持二叉排序树的性质,插入时,先应该创建一个新结点,这个新节点的码就是要插入的码,用这个结点的码与二叉树进行比较,若key大于二叉树根节点的key,则需要递归调用插入函数,但是插入函数中的参数root变为了root的右子树,直到找到根节点为空时,将新节点插入在这个位置。若key小于二叉树根节点的key,与上面的过程类似,就是递归参数变为了root的左子树。代码如下:
void SearchTreeInsert1(SearchTreeNode **root, SearchTreeType key)
{
    if (root == NULL)
        return;
    SearchTreeNode* newnode = CreateNewNode(key);
    if (*root == NULL)    //空树
    {
        *root = newnode;
        return;
    }
    if ((*root)->key > key)
    {
        SearchTreeInsert1(&(*root)->lchild, key);
        return;
    }
    else if ((*root)->key < key)
    {
        SearchTreeInsert1(&(*root)->rchild, key);
        return;
    }
}

二叉树上的查找,因为这是一个二叉排序树,所以查找时是一个逐渐缩小范围的过程,用当前根节点与要查找的key继续比较,若小于key,则递归调用查找函数在其右子树中继续查找,若大于key,则在其左子树中继续查找,如果,两个值相等,则表示找到了该元素,要是root结点为空时,则表示并没有此元素。

SearchTreeNode* SearchTreeFind1(SearchTreeNode *root, SearchTreeType to_find)
{
    if (root == NULL)     //空树
        return 0;
    if (root->key < to_find)
    {
        SearchTreeFind1(root->rchild, to_find);
        return 0;
    }
    else if (root->key>to_find)
    {
        SearchTreeFind1(root->lchild, to_find);
        return 0;
    }
    else
        return root;
}

二叉排序树的删除,删除二叉树中的某个元素时,只能删除他自己,不能将其子树也一起删掉,所以不仅需要删除该节点,还需要将其子树做一定的调整,得保证删除节点后的二叉树还是二叉排序树。所以需要分情况讨论,根据要删除节点的子树情况不同来讨论。

void SearchTreeRemove1(SearchTreeNode **root, SearchTreeType key)
{
    if (NULL == root)
        return;
    if (NULL == *root)
        return;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值