排序二叉树的基本操作

#include "iostream"
using namespace std;

typedef struct da
{
 int num;
 struct da *left,*right;
}dat,*data;

int search(data temp,int n)
{
 if(temp == NULL)
  return 1;
 if(temp ->num == n)
 {
  cout<<n<<"is found!"<<endl;
  return 0;
 }
 else
  if(n > temp ->num)
   return search(temp ->right,n);
  else
   return search(temp ->left,n);
}
void searchone(data top)
{
 int n;
 cout<<"enter the num of you want to search :";
 cin>>n;
 if(search(top,n) == 1)
  cout<<n<<"is not found!"<<endl;

}
void buildone1(data &temp,int n) //将一个序列插入二叉树的递归形式
{
 if(temp)        //if根节点不为空
 {
  if(n > temp ->num) //n > temp ->num就进入右节点
   buildone1(temp ->right,n);
  else        //n 不> temp ->num就进入左节点
   buildone1(temp ->left,n);
 }
 else
 {
  temp = new dat;
  temp ->num = n;
  temp ->left = NULL;
  temp ->right = NULL;
 }
}
void buildone(data &temp,int n)     //将一个序列插入排序二叉树     非递归形式
{
 data temp1 = new dat;         //定义一个结构空间
 data temp2 = NULL;
 temp1 ->num = n;           //将值存入结构
 temp1 ->left = NULL;          //将结构的左右指针都赋空值
 temp1 ->right = NULL;
 if(temp == NULL)           //判断谁否是根节点
  temp = temp1;
 else            
 {
  temp2 = temp;           //用temp2来操控排序树
  while(1)              //根据排序二叉树的性质进行遍历
  {
   if(n > temp2 ->num)      //如果传入的值大于该节点的值就进入右子树
    if(temp2 ->right)
     temp2 = temp2 ->right;    //右节点不为空temp2就往右走
    else          
    {
     temp2 ->right = temp1;    //为空就将节点插入最后并且结束循环
     break;
    }
   else           //传入的值不大于该节点的值就进入左子树
    if(temp2 ->left)        //左节点不为空temp2就往左走
     temp2 = temp2 ->left;
    else          
    {
     temp2 ->left = temp1;    //左节点为空就插入并结束循环
     break;
    }
  }
 }

}
data build(int a[])      //排序二叉树的建立
{
 int i;
 data top = NULL;    //将控制头结点的指针赋值空
 for(i = 0;i < 10;i++)    //利用循环建立节点构成排序树
  buildone1(top,a[i]);   //构成函数
 return top;       //返回头结点
}

int put(data top)    //非递归形式的按层遍历
{
 data temp = NULL;  
 data queue[10];   //建立一个队列
 int head,tail;
 cout<<"the tree is :";
 if(top == NULL)   //判断排序树是否为空
 {
  cout<<"this tree is NULL"<<endl;
  return 0;
 }
 else
 {
  head = -1;    //将队列初始化
  tail = 0;
  queue[0] = top;  //根节点存入队列
  while(tail > head)   //队列不为空就循环
  {
   temp = queue[++head]; //将对头成员取出输出
   cout<<temp ->num<<' ';
   if(temp ->left)      //if左右节点存在就将其存入队列
    queue[++tail] = temp ->left;
   if(temp ->right)
    queue[++tail] = temp ->right;
  }
 }
 cout<<endl;
 return 1;
}
int main(void)
{
 int a[10] = {5,1,8,2,0,3,9,4,7,6};
 data top = NULL;
 top = build(a); 
 put(top);
 searchone(top);

 getchar();
 getchar();
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值