二叉排序树

二叉排序树(Binary Sort Tree)中,任意结点x,其左子树所有结点的值不大于key[x] ,其右子树的所有结点值不小于key[x]。BST中的操作SEARCH、MINIMUM、MAXIMUM、SUCCESSOR、 PREDECCESSOR、INSERT、DELETE都可以在O(h)内完成,h为树的高度。BST可以用作字典,也可以用作优先队列。

BST的C语言实现和操作实例如下:

#include "stdio.h"
#include "stdlib.h"

/* struct of binary tree node */
struct Node {
int key;
struct Node *parent;
struct Node *left;
struct Node *right;
};

/* print binary sort tree by inorder*/
void PrintTree(struct Node *Root)
{
struct Node *pointer=(struct Node*)malloc(sizeof(struct Node));
pointer=Root;
if(pointer!=NULL) {
PrintTree(pointer->left);
printf("%d ",pointer->key);
PrintTree(pointer->right);
}
}

/* destroy binary sort tree */
void DeleteTree(struct Node *Root)
{
struct Node *pointer=(struct Node*)malloc(sizeof(struct Node));
pointer=Root;

if(pointer!=NULL) {
DeleteTree(pointer->left);
free(pointer);
DeleteTree(pointer->right);
}
}

/* Minimum */
struct Node *Minimum(struct Node *Root)
{
struct Node *pointer=(struct Node*)malloc(sizeof(struct Node));
pointer=Root;

while(pointer->left!=NULL)
pointer=pointer->left;

return pointer;
}

/* Maximum */
struct Node *Maximum(struct Node *Root)
{
struct Node *pointer=(struct Node*)malloc(sizeof(struct Node));
pointer=Root;

while(pointer->right!=NULL)
pointer=pointer->right;

return pointer;
}

/* tree search */
struct Node *Search(struct Node *Root,int value)
{
struct Node *pointer=(struct Node*)malloc(sizeof(struct Node));
pointer=Root;

while(pointer!=NULL&&pointer->key!=value) {
if(value<pointer->key)
pointer=pointer->left;
else
pointer=pointer->right;
}

return pointer;
}

/* Successor */
struct Node *Successor(struct Node *pointer)
{
if(pointer->right!=NULL)
return Minimum(pointer->right);

struct Node *y=(struct Node*)malloc(sizeof(struct Node));
y=pointer->parent;
while(y!=NULL&&y->right==pointer) {
pointer=y;
y=pointer->parent;
}

return y;
}

/* Predecessor */
struct Node *Predecessor(struct Node *pointer)
{
if(pointer->left!=NULL)
return Maximum(pointer->left);

struct Node *y=(struct Node*)malloc(sizeof(struct Node));
y=pointer->parent;
while(y!=NULL&&y->left==pointer) {
pointer=y;
y=pointer->parent;
}

return y;
}

/* Insert */
struct Node *Insert(struct Node *Root,struct Node *newNode)
{
struct Node *back=(struct Node*)malloc(sizeof(struct Node));
struct Node *pointer=(struct Node*)malloc(sizeof(struct Node));
back=NULL;
pointer=Root;

/* find the location to insert */
while(pointer!=NULL) {
back=pointer;
if(newNode->key<pointer->key)
pointer=pointer->left;
else
pointer=pointer->right;
}

newNode->parent=back;

if(back==NULL)
Root=newNode;
else {
if(newNode->key<back->key)
back->left=newNode;
else
back->right=newNode;
}

return Root;
}

/* Delete */
struct Node *Delete(struct Node *Root,struct Node *pointer)
{
struct Node *y=(struct Node*)malloc(sizeof(struct Node));
y->parent=NULL;
y->left=NULL;
y->right=NULL;
/* find the real node to delete */
if(pointer->left==NULL||pointer->right==NULL)
y=pointer;
else
y=Successor(pointer);

struct Node *x=(struct Node*)malloc(sizeof(struct Node));
x->parent=NULL;
x->left=NULL;
x->right=NULL;

if(y->left!=NULL)
x=y->left;
else
x=y->right;

if(x!=NULL)
x->parent=y->parent;

if(y->parent==NULL)
Root=x;
else {
if(y==y->parent->left)
y->parent->left=x;
else
y->parent->right=x;
}

int key = pointer->key;

if(y!=pointer)
pointer->key=y->key;


if(y!=NULL) {
free(y);
}

return Root;
}

int main(int argc, char *argv[])
{
int a[10] = {45, 24, 55, 12, 37, 53, 60, 28, 40, 70};
struct Node *Root = NULL;
int i;

for (i=0; i<10; ++i) {
struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->key = a[i];
newNode->parent = NULL;
newNode->left = NULL;
newNode->right = NULL;
Root = Insert(Root,newNode);
}
PrintTree(Root);

/* transfer BST to the RIGHT BST (every node only have right child) */
struct Node *p, *trans_bst = NULL;
p = Minimum(Root);
while(p) {
struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->key = p->key;
newNode->parent = NULL;
newNode->left = NULL;
newNode->right = NULL;
trans_bst = Insert(trans_bst, newNode);
p = Successor(p);
}

p = trans_bst;
while(p) {
printf("%4d", p->key);
p = p->right;
}
DeleteTree(Root);
DeleteTree(trans_bst);

return 0;
}

(刘爱贵 / Aiguille LIU)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值