标签:二叉查找树 二叉排序树 二叉查找树删除节点 bst删除节点
              50                                        50
           /      \              delete(20)        /               30      70        ------------------>  30      70 
        /   \      /   \                               \      /   \ 
     20   40  60   80                           40   60   80
              50                                           50
            /      \           delete(30)              /             30      70       ------------------>      40     70 
            \      /    \                              /    \ 
            40  60   80                         60   80
              50                                           60
           /      \             delete(50)             /              40      70       ----------------->       40     70 
                  /    \                                           \ 
                60    80                                        80
需要注意的一个重点是:仅当右孩子不为空时,才需要后继节点。在这种特定情况下,可以通过查找右子树的最小值来获取到后继节点。
代码实现:
#include <iostream>
struct Node
{
	int key;
	Node *left;
	Node *right;
};
Node * minValueNode(Node* node)
{
	Node* current = node;
	//查找最左侧的叶子
	while (current->left != NULL)
		current = current->left;
	return current;
}
//删除二叉搜索树的一个指定节点,并返回新的根节点
Node* deleteNode(Node* root, int key)
{
	// base case
	if (root == NULL)
		return root;
	//如果指定值小于根节点值,则这个值处于左子树中。
	if (key < root->key)
		root->left = deleteNode(root->left, key);
	//如果指定值大于根节点值,则这个值处于右子树中。
	else if (key > root->key)
		root->right = deleteNode(root->right, key);
	//找到了匹配的节点
	else
	{
		// 此节点可能有孩子,也可能没有.
		// 这里处理只有一个孩子,或者没有孩子的情况
		if (root->left == NULL)
		{
			Node *temp = root->right;
			delete root;
			return temp;
		}
		else if (root->right == NULL)
		{
			Node *temp = root->left;
			delete root;
			return temp;
		}
		// 处理有两个孩子的情况: 取得中序遍历中当前节点的后继节点,即右子树中的最小值(最左侧的叶子)。
		Node* temp = minValueNode(root->right);
		// 将后继节点中的值替换掉匹配节点中的值
		root->key = temp->key;
		// 删除后继节点
		root->right = deleteNode(root->right, temp->key);
	}
	return root;
}
// 创建一个新的BST节点
Node *createNewNode(int item)
{
	Node *temp = new Node;
	temp->key = item;
	temp->left = temp->right = NULL;
	return temp;
}
// 中序遍历二叉搜索树
void inorder(Node *root)
{
	if (root != NULL)
	{
		inorder(root->left);
		std::cout << " " << root->key << " ";
		inorder(root->right);
	}
}
//插入新节点至二叉搜索树中
Node* insert(Node* node, int key)
{
	//空树
	if (node == NULL)
		return createNewNode(key);
	//递归插入。如果已存在指定值,则不插入
	if (key < node->key)
		node->left = insert(node->left, key);
	else if (key > node->key)
		node->right = insert(node->right, key);
	//返回未修改的node指针
	return node;
}
int main()
{
	/* 构建一颗如下所示的BST
	50
	/     	30      70
	/  \    /  	20   40  60   80
	*/
	Node *root = NULL;
	root = insert(root, 50);
	insert(root, 30);
	insert(root, 20);
	insert(root, 40);
	insert(root, 70);
	insert(root, 60);
	insert(root, 80);
	std::cout << "Inorder traversal of the given tree \n";
	inorder(root);
	std::cout << "\nDelete 20\n";
	root = deleteNode(root, 20);
	std::cout << "Inorder traversal of the modified tree \n";
	inorder(root);
	std::cout << "\nDelete 30\n";
	root = deleteNode(root, 30);
	std::cout << "Inorder traversal of the modified tree \n";
	inorder(root);
	std::cout << "\nDelete 50\n";
	root = deleteNode(root, 50);
	std::cout << "Inorder traversal of the modified tree \n";
	inorder(root);
	return 0;
}输出:标签:二叉查找树 二叉排序树 二叉查找树删除节点 bst删除节点
原文地址:http://blog.csdn.net/shltsh/article/details/46510115