BST树

 

 

 

#include <cstdlib>

#include <iostream>

#define N 10 

using namespace std;

typedef struct node *link;

struct node {

       int item;

       link l,r;

       };

link NODE(int item,link l,link r)

{

 link t = (link)malloc(sizeof(struct node));

 t->item = item;

 t->l = l;

 t->r = r;

 return t;      

}

link insert_node(link t,int item)

{

  if(t == NULL) return NODE(item,NULL,NULL);

  if(item < t->item)

	  t->l = insert_node(t->l,item);

  else

	  t->r = insert_node(t->r,item);

  return t;

}

//中序打印

void inOrder(link root){

if(root){

 inOrder(root->l);

 cout<<root->item<<"  ";

 inOrder(root->r);



         }

}

link bst_remove(link t,int item)

{

  if(t == NULL) return NULL; //没找到,不做操作

  if(item < t->item)//小于,向左找

          t->l = bst_remove(t->l,item);

   else if(item > t->item)//大于。向右找 

          t->r = bst_remove(t->r,item);

   else  {//等于,做操作

    link x;

          if(t->l){//左子树不为空,在左子树取最大值替换当前需要删除的点 

                  for(x = t->l;x->r;x= x->r){;}//最大值在右边,x指向最大的节点(叶节点)

                   t->item = x->item; //把x拿上去;

                   t->l = bst_remove(t->l,t->item); 

                   }

            else if(t->r){//左子树为空。 

                 for(x = t->r;x->l;x = x->l){;}//最小值在左边 ,x指向最小的节点(叶节点) 

                 t->item = x->item;//把x拿上去 

                 t->r = bst_remove(t->r,t->item);

                  }

            else{//既没有左子树,又没有右子树,直接删除

            free(t);

            t = NULL;             

                 }      

         }  

     return t;//t为树的根节点 

}

int main(int argc, char *argv[])

{

    srand(time(NULL));

    link root = NULL;

    int a[] = {1,40,20,11,9,5,17,18,88,29};

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

    {

            root = insert_node(root,a[i]);

     }

    

    inOrder(root);

    cout<<endl;

    root = bst_remove(root ,18);

    inOrder(root);

    system("PAUSE");

    return EXIT_SUCCESS;

}


 

 

 

 

你可能感兴趣的:(BST)