二叉搜索树(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);
}
}
}

浙公网安备 33010602011771号