BST的删除

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
//const MAX=50;
using namespace std;

struct BitreeNode{
	//int num=1;
	int data;
	BitreeNode *lchild;
	BitreeNode *rchild;
}; 
typedef struct BitreeNode *Bitree;
//typedef t p;

bool Delete(Bitree *t);

void pre_order(BitreeNode *t)//
{
    if(t==NULL)
	{
		return ;
	}
	
	cout<<t->data<<" ";
	
	 pre_order(t->lchild);
	 pre_order(t->rchild);
	
	return;
}

void in_order(BitreeNode *t)//
{
	if(t==NULL)
	{
		return;
	}
	in_order(t->lchild);
	cout<<t->data<<" ";
	in_order(t->rchild);
	
	return;
}

void insert_tree(int data,BitreeNode *&t)//二查搜索树的建立 
{
	if(t==NULL)//
	{
		t=new BitreeNode;
		t->data=data;
		//strcpy(t->data,data);
		t->lchild=NULL;
		t->rchild=NULL;
		
		return;
	}
	
	if( (t->data)<data )
	{
		insert_tree(data,t->rchild);
	}
	
	if( (t->data)>data )
	{
		insert_tree(data,t->lchild);
	}
	
	return;
}

Bitree foundNode(int x,Bitree t)//寻找结点 //返回该结点的地址 
{
    if(t==NULL)
    {
    	cout<<"No Found!";
    	return NULL;
    }
 	
 	if(x>(t->data))
 	{
 		return foundNode(x,t->rchild);
 	}
 	
 	if(x<(t->data))
 	{
 		return foundNode(x,t->lchild);
 	}
 	
 	if(x==(t->data))
 	{
 		//cout<<x;
 		//t=NULL;    //---
		///delete t; //----
 		
 		return t;		
 	}
 	
 	//return; 
}

int deletemin(Bitree t)//删除最小的结点 
{
	if(t==NULL)
	{
		cout<<"空树";
		return -1;
	}
	
	if(t->lchild==NULL)//根节点左空 
	{
		cout<<"最小的结点是根节点无法删除:"<<t->data<<endl;
		
		
		return -1;
	}
	 	
	if((t->lchild->lchild)==NULL)
	{
		//cout<<t->lchild->data<<endl;
		     //delete t->lchild;  //删除 
		     //t->lchild=NULL; 
		     int a=t->lchild->data;//封装最小结点 
		     t->lchild=t->lchild->rchild;//删除最小结点 
		     
		return a;
	}
	
	return deletemin(t->lchild);
	
	//return;
}

bool deleteBST(int x,Bitree *t)//删除某个结点
{
  
  if((*t)==NULL)
  {
  	return 0;
  }
  
  if((*t)->data>x)//x小于当前 
  {
  	return deleteBST(x,&(*t)->lchild);
  }	
	
  if((*t)->data<x)//x大于当前 
  {
  	return deleteBST(x,&(*t)->rchild);
  }	
	
  if((*t)->data==x)//x等于于当前 
  {
  	return Delete(t);
  }	 
   	
} 

bool Delete(Bitree *t)//给入要删除的结点t的指针 
{
	Bitree q,s;
	
	if((*t)->lchild==NULL)//左空 
	{
	    q=*t;	 
	   (*t)=(*t)->rchild; 
	   delete (q);
	   
	   return 1;
	}
	
	if((*t)->rchild==NULL)//右空 
	{
	    q=*t;	 
	   (*t)=(*t)->lchild; 
	   delete (q);
	   
	   return 1;
	}
	
	
	 q=*t ; s=(*t)->lchild;	 
	 while(s->rchild!=NULL)
	 {
	 	q=s;
	 	s=s->rchild;
	 }
    
     (*t)->data=s->data;
     
     if(q!=*t)
     {
     	q->rchild=s->lchild;
     }
     else
     {
     	q->lchild=s->lchild;
     }
	
    return 1;
	
	
}

//bool Delete()

int main()
{
	freopen("bin.txt","r",stdin);
	//int j=0;
	//CreateTree(T);
	//j=rand()%10;//
	//pre_order(T);
	//cout<<"\n";
    //in_order(T);
	//char st[MAX];
	//F=foundNode(18,T);	
	//cout<<F->data;
	 //cout<<deletemin(T->rchild->rchild);
   //in_order(T);
	
	BitreeNode *T=NULL;//*F=NULL;//
    int num=0;
	
	for(int i=1;i<=12;i++)
	{
		//gets(st);
		cin>>num;
		insert_tree(num,T);
	}
	
	
	deleteBST(12,&T);
    in_order(T);

	return 0;
}

  

posted @ 2015-04-22 14:43  Sundy.Lee  阅读(214)  评论(0编辑  收藏  举报