binary_search_tree
typedef struct btree{
int data;
btree *left,*right;
}btree
inorder
preorder
postorder
int inorder(btree* t)
{
if(t!=null)
{
inorder(t->left);
cout>>t->data;
inorder(t->right);
}
}
btree* search(btree* t,int x)
{
if(t==null||t->data==x)
return t;
if(x<t->data)
return search(t->left,x);
else
return search(t->right,x);
}
btree* search(btree* t,int x)
{
while(t&&t->data!=x)
{
if(x<t->data)
t=t->left;
else
t=t->right;
}
return t;
}
btree* getMin(btree* t)
{
while(t->left){
t=t->left;
}
return t;
}
btree* getMax(btree* t)
{
while(t->right){
t=t->right;
}
return t;
}
btree* insert(btree* t,int x)
{
if(t==null)
{
t=(btree*)malloc(sizeof(btree));
t->data=x;
t->left=t->right=NULL;
}else if(x<=t->data)
t->left=insert(t->left,x);
else if(x>t->data)
t->right=insert(t->right,x);
return t;
}
二叉搜索树
建立就是循环n次插入的过程
插入是递归的过程
查找是递归的过程
求前驱或后继的算法:
TREE-SUCCESSOR(x)
if x.right!=NULL
return TREE-MIN(x.right);// 右孩子不空时,右子树的最小值就是后继
y=x.p
while(y!=NULL&&x==y.right)// 向上找到x的树根,就是其后继
x=y
y=y.p
return y;
删除分三种情形:
1,Z没有孩子结点,直接删除
2,Z有一个孩子,将孩子代替Z的位置
3,Z有两个孩子,找到Z的后继Y(右子树中),让Y代替Z的位置,Y的右孩子代替Y