二叉查找树后继节点和前驱节点查找

二叉查找树按照二叉树进行组织。二叉查找树关键字的存储方式总是瞒住二叉查找树性质:

设x为二查查找树种一个节点。如果y是x的左子树中的一个节点,那么key[x] >= key[y]。如果y是x的右子树的一个节点,那么key[x] <= key[y]。

这样对二叉查找树进行中序遍历就可得到书中所有元素的一个非降序排列。

查找某一个存在节点的前驱和后继。某一个节点x的后继就是大于key[x]的关键字中最小的那个节点,前驱就是小于key[x]的关键字中最大的那个节点。查找二叉前驱和后继节点的算法如下所示:

typedef struct _node {  
	struct _node *left_child;  
	struct _node *right_child;  
	struct _node * parent;
	ctype    data;  
}node; //树节点数据结构定义

typedef node* Tree;

//查找二叉查找树中关键字最小的节点,返回指向该节点的指针
Tree tree_minimum(Tree root)
{
	Tree p = root;
	while (p->left_child != null)
		p = p->left_child;
	return p;
}

//查找二叉查找树中关键字最大的节点,返回指向该节点的指针
Tree tree_maxmum(Tree root)
{
	Tree p = root;

	while (p->right_child != null)
	{
		p = p->right_child;
	}
	return p;
}

//查找二叉查找树中节点x的后继节点,返回指向该节点的指针
//在查找过程中,如果节点x右子树不为空,那么返回右子树的最小节点即可
//如果节点x的右子树为空,那么后继节点为x的某一个祖先节点的父节点,而且该祖先节点是作为其父节点的左儿子
Tree tree_successor(Tree x)
{
	if (x->right_child != null)
		return tree_minimum(x->right_child);
	
	//x用来保存待确定的节点
	//y为x的父节点
	Tree y = x->parent;

	while (y != NULL && x == y->right_child)
	{
		x = y;
		y = y->parent;
	}
	return y;
}


//查找二叉查找树中节点x的前驱节点,返回指向该节点的指针
//在查找过程中,如果节点x左子树不为空,那么返回左子树的最大节点即可
//如果节点x的左子树为空,那么前驱节点为x的某一个祖先节点的父节点,而且该祖先节点是作为其父节点的右儿子
Tree tree_predecessor(Tree x)
{
	if (x->left_child != null)
		return tree_maxmum(x->left_child);

	Tree y = x->parent;
	while (y != NULL && x == y->left_child)
	{
		x = y;
		y = y->parent;
	}
	return y;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值