首页 > 其他 > 详细

二叉搜索树

时间:2020-01-19 17:44:42      阅读:81      评论:0      收藏:0      [点我收藏+]
typedef struct node{
	ElemType key;
	struct node* left, * right;
	struct node* p;
}*TREE;
typedef struct {
	TREE root;
}*ROOTTREE;

  查找

TREE TREE_SEARCH(TREE x, int k)
{
	if (x == NULL || k == x->key)
		return x;
	if (k < x->key)
		return TREE_SEARCH(x->left, k);
	else
		return TREE_SEARCH(x->right, k);
}

  最大关键字元素和最小关键字元素

TREE TREE_MINIMUM(TREE x)
{
	while (x->left != NULL)
		x = x->left;
	return x;
}

  

TREE TREE_MAXIMUM(TREE x)
{
	while (x->right != NULL)
		x = x->right;
	return x;
}

  后继

TREE tree_successor(TREE x)
{
	TREE y;
	if (x->right != NULL)
		return TREE_MAXIMUM(x->right);
	y = x->p;
	while (y != NULL && y->right = x)
	{
		x = y;
		y = x->p;
	}
	return y;
}

  技术分享图片

插入

void tree_insert(ROOTTREE T,TREE z)
{
	TREE x, y;
	x = T->root;
	while (x != NULL)
	{
		y = x;
		if (z->key < x->key)
			x = x->left;
		else
			x = x->right;
	}
	z->p = y;
	if (y == NULL)
		T->root = x;
	else if (z->key < y->key)
		y->left = z;
	else
		y->right = x;
}

 技术分享图片

删除

定义一个子过程transplant,用一棵子树代替另一棵子树。

void transplant(ROOTTREE T, TREE u, TREE v)
{
	if (u->p == NULL)
		T->root = v;
	else if (u->p->left == u)
		u->p->left = v;
	else
		u->p->right = v;
	if (v != NULL)
		v->p = u->p;
}

  删除的情况有四种

技术分享图片

void tree_delete(ROOTTREE T, TREE z)
{
	TREE y;
	if (z->left == NULL)
		transplant(T, z, z->right);
	else if (z->right == NULL)
		transplant(T, z, z->left);
	else
	{
		y = TREE_MAXIMUM(z->right);
		if (y != z->right)
		{
			transplant(T, y, y->right);
			y->right = z->right;
			z->right->p = y;
		}
		transplant(T, z, y);
		y->left = z->left;
		y->left->p = y;
	}
}

  

二叉搜索树

原文:https://www.cnblogs.com/KIROsola/p/12214331.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!