二叉搜索树(Binary Search Tree)

  • inorder_tree(k):打印树根为k的树的中序遍历
  • Search_tree(k):查找k节点是否存在
  • minum(k): 查找以k为根的子树最小值
  • maxnum(k):查找以k为根的子树最大值
  • post_node(k):查找结点k的后驱结点
  • pre_node(k):查找结点k的前趋结点
  • Node_insert(k):插入结点k
  • Node_delete(K):删除结点k

P.S:在建树时最好随机化插入节点,防止树出现退化。


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>

#define rep(i,x,y) for (int i=x;i<=y;i++)
#define dep(i,y,x) for (int i=y;i>=x;i--)
#define read(x) scanf("%d",&x)

using namespace std;

struct Node{
  int v;
  Node *left,*right,*fa;
  Node(int k):left(NULL),right(NULL),fa(NULL),v(k) {}
} *root;

Node *newnode(int k) {return new Node(k);}

int s,p;
//----------------Define--------------------


void transplant(Node*v,Node *u)
{
 if (u->fa==NULL)
  root=v;
 else 
  if ((u->fa)->left==u) 
    (u->fa)->left=v;
  else
    (u->fa)->right=v;
 if (v!=NULL)
  v->fa=(u->fa);
}

void inorder_tree(Node* k)
{
 if (k==NULL) return;

 inorder_tree(k->left);
 printf("%d\n",k->v);
 inorder_tree(k->right);
}

Node* search_tree(Node *k,int num)
{
 while (k!=NULL) 
 {
  if (k->v==num) return k;
  if (num<(k->v)) k=k->left; else k=k->right;
 }
 return NULL;
}

Node* minnum(Node *k) {while ((k->left)!=NULL) k=k->left;return k;}

Node* maxnum(Node *k) {while ((k->right)!=NULL) k=k->right;return k;}

Node* post_node(Node *k) 
{
 if ((k->right)!=NULL) return minnum(k->right);

 Node *y=k->fa;
 while (y!=NULL && ((y->right)==k))
 {
  k=y;
  y=k->fa;
 }
 return y;
}

Node *pre_node(Node *k)
{
 if ((k->left)!=NULL) return k->left;

 Node *y=k->fa;
 while (y!=NULL && ((y->left)==k))
 {
  k=y;
  y=k->fa;
 }
 return y;
}

void Node_insert(Node *k,Node *z)
{
 Node *x=k,*p;
 int key=z->v;
 while (x!=NULL)
 {
  p=x;
  if (key<(x->v)) x=x->left; else x=x->right;
 }

 if (root==NULL) {root=newnode(z->v);return;}
 if ((z->v)<(p->v)) {p->left=z;z->fa=p;} else {p->right=z;z->fa=p;}
} 

void Node_delete(Node *k)
{
 if (k->left==NULL) 
  transplant(k->right,k);
 else
   if (k->right==NULL) 
     transplant(k->left,k);
   else 
   {
     Node *y=post_node(k);
     
     if (k->right==y) 
       transplant(k->right,k);
     else 
     {
      transplant(y->right,y);
      y->right=k->right;
      y->left=k->left;
      transplant(y,k);
     }
   }
}
posted @ 2016-02-03 23:03  Krew  阅读(181)  评论(0)    收藏  举报