binary search tree 二叉搜索树

二叉搜索树是一种基于树形结构的查找算法.

它的生成方法是这样的:

每一棵树的左子子树的值总是小于父结点的值,右子树的值总是大于父结点的值..就是这样的...

下面是实现插入算法的代码:

struct Node

{

   int data;

   struct Node leftchild;

   struct Node rightchild;

};

 

struct Node *root = NULL;        //根结点

void insert(int element)

{

       struct Node *preNode;

       struc  Node *currentNode = root;

       while(currentNode!=NULL)

       {

            preNode = currentNode;
            if(element>currentNode->data)

            {

                 currentNode = currentNode->rightchild;

            }

            else

          {

               currentNode = currentNode->leftchild;

          }

      struct Node *pnew = new struct Node;

      pnew->data = element;

      pnew->leftchild = pnew->rightchild = NULL;   //这步初始化空指针操作非常重要,相当于字符串操作中的'/0'

      if(root == NULL)

      {

         root = pnew;

      }

      else         

    {

           if(element > preNode->data)

           {

               preNode->rightchild = pnew;

           }

          else

           {
               preNode->leftchild = pnew;

           }

     }

    }

}

 

//这个算法的思路是:不断的循环来找到那个插入位置,找到正确的位置,判断新增的结点是要做左子结点还是右子结点,然后生成一个新的树

虽然树形结构从形态上看是立体的,但是因为生成树时的思路,使得我们访问树时,使用了类似线性结构的处理方法,太奇妙了.

 

void find_node(int element)

{

       struct Node *ptr = root;

       while(ptr!=NULL &&ptr->data!=element)

       {

               if(element >ptr->info)

               {

                    ptr = ptr->rightchild;

               }

               else

              {

                   ptr = ptr->leftchild;

              }

       }

       if(ptr==NULL)

       {

            return false;

       }

       else

      {

           return true;

      }

}

 

//对于一个数据结构来说, 增 删 改 查 四种操作必不可少.我们现在实现了,增和查(查找函数改一下就变成repleace函数了),还差删除函数

 

//对于一棵搜索二叉树来说:删除结点的操作就没有那种容易了;

 

 在对结点进行删除时,分为三种情况;

1 待删除的结点是叶子结点 leaf

2 待删除的结点还有一棵左子树或右子树

3 待删除的结点同时拥有左右子树

 

第一种情况 直接删除就OK啦

第二种情况, 将结点删除,然后将那结点的那棵不空的子树来顶替被删除的位置

第三种情况有两种选择:

1 从待删结点的左子树中找到最大值来替换待删结点.这样做仍会生成一棵二叉树.

2 从待删结点的右子树中找到最小值来替换待删除结点

我选择从第一种情况;

bool delete_node(int element)

{

        //首先找到那个结点

       struct *currentNode = root;

       struct *preNode = NULL;

       while(currentNode!=NULL && currentNode->data!=element)

       {

               preNode = currentNode;

               if(element>currentNode->data)

               {

                     currentNode = currentNode->rightchild;

               }

               else

               {

                    currentNode = currentNode->leftchild;

               }

       }

       if(current==NULL)

       {

             return false;

       }

       if(currentNode->left!=NULL && currentNode->right!=NULL)   //如果左右子树都不为空的话,

       {

              struct Node*subcurrentNode = currentNode->leftchild;

              struct Node *subptrNode = NULL;

               while(subcurrentNode->rightchild!=NULL)

              {

                        subcurrentNode = subcurrentNode->rightchild;

              } 

              currentNode->data = subcurrent->data;

              currentNode = subcurrentNode;

              preNode = subptrNode;

       } 

       struct Node *temp;

       temp = (currentNode->left==NULL)?currentNode->rightchild:current->leftchild;

       if(currentNode == root)

       {

                  root = c; 

       }

       else

       {

            if(currentNode == preNode->left)

            {

                preNode->left = c;

            }

            else

            {

                preNode->right = c;

             }

       }

      }

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值