BST的插入和删除

[b]Binary Search Tree[/b]
由于经常的插入删除操作会变得越来越不平衡,导致运行效率低下,但删除操作还是蛮漂亮的。
本代码来自《算法导论》,也可以用递归做,但肯定没有迭代效率高。
typedef int ElementType;

typedef struct TreeNode
{
ElementType key;
struct TreeNode *parent;
struct TreeNode *left;
struct TreeNode *right;
} Node, *BST;

// T:root, z:指向要插入节点的指针
void Insert(BST T, Node *z)
{
Node *x = T;
Node *y = NULL;

while (x != NULL) {
y = x;
if (x->key > z->key)
x = x->left;
else
x = x->right;
}

z->parent = y;

if (y == NULL)
T = z;
else if (y->key > z->key)
y->left = z;
else
y->right = z;
}

// x的parent => y的parent
void Transplant(BST T, Node *x, Node *y)
{
if (x->parent == NULL)
T = y;
else if (x == x->parent->left)
x->parent->left = y;
else
x->parent->right = y;

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

// z:指向要删除节点的指针
void Delete(BST T, Node *z)
{
if (z->left == NULL)
Transplant(T, z, z->right);
else if (z->right == NULL)
Transplant(T, z, z->left);
else
{
Node *y = FindMin(z->right); // y not have left child

if (y->parent != z) {
Transplant(T, y, y->right);
y->right = z->right;
y->right->parent = y;
}

Transplant(T, z, y);
y->left = z->left;
y->left->parent = y;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值