二叉排序树

来源:互联网 发布:淘宝低于5元不计销量 编辑:程序博客网 时间:2024/06/07 05:36

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

#include "stdafx.h"

typedef int datatype;

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

struct node

{

   datatypedata;

   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++;

   }

   returnt;

}

 

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;//如果叶子结点是双亲结点的左孩子

         elsef->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);//删除最大值的那个点

   }

   returnt;

}

 

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[])

{

   datatypea[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;

   intn;

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

  cin>>n;

  DeleteKey(t,n);

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

  display(t);

   return0;

}

 

 

原创粉丝点击