二叉排序树

本文介绍了一种二叉排序树的基本操作实现方法,包括插入、查找和删除节点等核心功能,并通过C++代码示例详细展示了这些操作的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 二叉排序树.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"

typedef int datatype;

const int arr_len = 9;//假设数组长度为9

struct node

{

   datatype data;

   node* lchild,*rchild;

};

 

int Insert(node *&p,datatype data)

{

   if(p == NULL)

   {

      p = new node;

      p->lchild = p->rchild = NULL;

      p->data = data;

      return 1;

   }

   else if (data == p->data)//树中不允许存在值相同的点

   {

      return 0;

   }

   else if(data < p->data)//如果值小于该节点,插入到该节点的左子树中

   {

      return Insert(p->lchild,data);

   }

   else//如果值大于该节点,插入到该节点的右子树中

   {

      Insert(p->rchild,data);

   }

}

 

void input(datatype a[],int len)//输入数据

{

   cout<<"请输入"<<len<<"个数据"<<endl;

   for (int i = 0; i < arr_len; i++)

   {

      cin>>a[i];

   }

}


//二叉树的生成:从一个空树开始,没插入一个关键字

//就调用一次插入算法将它插入到当前已生成的二叉排序树中

node *CreateTree(datatype a[],int n)

{

   node *t = NULL;

   int i = 0;

   while (i < n)

   {

      Insert(t,a[i]);

      i++;

   }

   return t;

}

 

void display(node *t)//先序输出二叉树

{

   if(t == NULL)

   {

      return;

   }

   else

   {

      cout<<t->data;

      display(t->lchild);

      display(t->rchild);

   }

  

}

 

node *DeleteKey(node *t,int key)//删除结点

{

   node *f = NULL;

   node *p;

   p = t;

   //先找到要删除的点

   while ( p != NULL)

   {

      if(p->data == key)break;

      f = p;//用来保存待删除点的双亲结点

      if(p->data < key) p = p->rchild;

      else

      {

        p = p->lchild;

      }

   }

   if(p == NULL)

   {

      cout<<"没有找到删除点"<<endl;

      return NULL;

   }

   if(p->lchild == NULL && p->rchild == NULL)//如果待删除点是叶子结点

   {

      if (f != NULL)//如果待删除点不是根节点

      {

        if(f->lchild == t)f->lchild = NULL;//如果叶子结点是双亲结点的左孩子

          else f->rchild = NULL;//如果叶子结点是双亲结点的右孩子

      }

      delete(p);

      cout<<"该点已经成功删除"<<endl;

   }

 

   if(p->lchild == NULL)//如果待删点的左子树为空

   {

      if(f == NULL)//如果待删点左子树为空,并且待删点是根节点

      {

        t = p->lchild;

      }

      else if (f->lchild == p)//如果待删点左子树为空,并且待删点不是根节点,他是作为一棵树的左子树

      {

        f->lchild = p->lchild;

      }

      else//如果待删点左子树为空,并且待删点不是根节点,它是一棵树的右子树

      {

        f->rchild = p->rchild;

      }

      delete(p);

   }

 

   else//待删点存在左子树

   {

      node *q=p;

        node *s=p->lchild;

        while(s->rchild)//找到待删点所在的左子树的最大点s

        {

            q=s;//q作为待删点的双亲结点

            s=s->rchild;

        }

        if(p == q) q->lchild=s->lchild;//如果待删点的右子树为空

        else//如果待删点的右子树不为空

            q->rchild=s->lchild;//将最大值的点的左子树作为最大值点的双亲结点的右孩子

        p->data=s->data;//修改待删点的值

        free(s);//删除最大值的那个点

   }

   return t;

}

 

node *findNode(node *t,datatype data)

{

   if(t == NULL || t->data == data)

   {

      return t;

   }

   if(data < t->data)

   {

      return  findNode(t->lchild,data);

   }

   else

   {

      return findNode(t->rchild,data);

   }

}

int _tmain(int argc, _TCHAR* argv[])

{

   datatype a[arr_len];

   input(a,arr_len);

   node *t = CreateTree(a,arr_len);

   cout<<"前序遍历为:"<<endl;

   display(t);

   node *fn = findNode(t,3);

   if(fn != NULL)cout<<endl<<"查找成功!"<<endl;

   else

      cout<<"查找失败"<<endl;

   int n;

   cout<<"请输入你想删除的结点"<<endl;

   cin>>n;

   DeleteKey(t,n);

   cout<<"删除结点后的前序遍历为:"<<endl;

   display(t);

   return 0;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值