`
wq294948004
  • 浏览: 31569 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

BST的插入和删除

阅读更多
Binary Search Tree
由于经常的插入删除操作会变得越来越不平衡,导致运行效率低下,但删除操作还是蛮漂亮的。
本代码来自《算法导论》,也可以用递归做,但肯定没有迭代效率高。
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;
	}
}
分享到:
评论

相关推荐

    BST树节点的插入,删除和查找

    BST树因其特定的性质,为数据的快速插入、删除和查找提供了便利。在实际应用中,二叉搜索树常用于实现动态集合或映射,例如数据库索引。虽然BST在最坏情况下(树退化成链表)性能会降低,但在平均情况下仍能保持较好...

    C++二叉搜索树的插入和删除例子

    这种特性使得二叉搜索树在查找、插入和删除操作上具有较高的效率。 `bstree.cpp`和`bstree.h`这两个文件很可能是实现二叉搜索树插入和删除操作的源代码。在C++中,通常我们会定义一个名为`BSTNode`的结构体或类来...

    BST.rar_BST 删除_bst

    这种特性使得在二叉排序树中进行查找、插入和删除操作的时间复杂度在最佳情况下可以达到O(log n)。 在这个“BST.rar_BST 删除_bst”压缩包中,主要涉及的是二叉排序树的删除操作。删除操作是二叉排序树中最复杂的一...

    Avl树插入、删除c++实现

    这种平衡性质确保了AVL树在插入和删除操作时保持高效的查找性能,通常比普通的二叉查找树更快。在C++中实现AVL树的插入和删除功能,需要对二叉树的操作有深入理解,并且需要掌握旋转操作,以在必要时恢复树的平衡。 ...

    【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)

    【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归) 在计算机科学中,数据结构是存储和组织数据的方式,它直接影响到数据的处理效率。搜索二叉树(BST,Binary Search Tree)是一种特殊类型的数据结构,...

    二叉查找树BST,可以看看

    这种特性使得在BST中进行查找、插入和删除等操作时效率较高。 ### 一、创建BST 创建BST通常从空节点开始,然后逐步插入元素。插入节点时,按照BST的规则比较新元素与当前节点的值,决定是插入到左子树还是右子树。...

    BST.zip_bst

    因为它的特性,BST提供了快速的插入、删除和查找操作。以下是对二叉搜索树操作的详细说明: **插入操作**: - 插入新节点时,首先与根节点比较。如果新键小于根键,则递归地在左子树中插入;如果新键大于根键,则在...

    bst.rar_bst

    通常,BST类会包含插入、删除、查找和遍历等方法,而这些方法通过递归调用来处理树的各个部分。 总的来说,二叉搜索树是一种灵活的数据结构,适用于需要快速查找、插入和删除操作的应用场景。在理解和掌握BST的基础...

    从BST到SBT

    1. **标准BST插入**: 使用标准BST插入算法找到插入位置。 2. **调整size**: 更新插入节点的size值。 3. **平衡操作**: 通过旋转操作来重新平衡树。 **3.5 删除** 删除操作同样需要经过以下步骤: 1. **标准BST...

    AVL树的插入删除遍历等操作

    这种平衡性质确保了AVL树在插入、删除和搜索等操作上的高效性,时间复杂度通常为O(log n)。下面将详细讨论AVL树的基本概念、插入操作、删除操作、遍历以及平衡旋转。 1. AVL树的定义: AVL树是由G. M. Adelson-...

    BST_javaBST_https://bst.91_bstcom_

    这种结构使得BST非常适合于快速的查找、插入和删除操作。 在Java中实现BST,我们需要定义一个Node类来表示树的节点,这个Node通常会有key、value、left和right属性,分别代表键、值、左子节点和右子节点。以下是一...

    BST树的建立及各种操作

    建立BST树,并实现 插入 查找 删除等操作,

    BST.rar_bst_in

    这种性质使得在BST中进行查找、插入和删除操作的效率相对较高。 在C++中实现BST,通常会定义一个节点类(Node),包含一个整型值(key)、指向左子节点的指针(left)和指向右子节点的指针(right)。接下来是BST类...

    数据结构二叉树BST源代码

    在C++实现中,BST通常会定义一个类,类中包含节点的键值、指针以及插入、删除、查找等操作的成员函数。`BST`可能是这个类的实例或者包含了此类的代码文件。理解并能正确实现这些操作是掌握BST的关键,这将有助于深入...

    BST.rar_bst

    这种特性使得二叉搜索树在查找、插入和删除操作上具有高效性。 在这个名为"BST.rar_bst"的压缩包中,我们可以看到两个文件:"www.pudn.com.txt"和"BST"。"www.pudn.com.txt"可能是一个链接或说明文件,通常包含关于...

    BST.zip_bst问题_二叉树

    这种特性使得BST非常适合用于快速的查找、插入和删除操作。 ### 构建BST 构建BST通常从空树开始,通过插入节点来逐步形成。插入操作遵循以下步骤: 1. 如果树为空,新节点成为根节点。 2. 如果新节点的键值小于...

    AVL树\BST树\表table的原代码

    这种特性使得BST支持快速查找、插入和删除操作。然而,如果BST的构建方式导致树严重不平衡(例如,退化成链表),其性能会降低到O(n)。 **表(table)** 在这里可能指的是哈希表,它是一种数据结构,通过哈希函数将...

    二叉查找树的插入,删除,查找

    总结起来,二叉查找树通过插入、删除和查找操作提供了高效的数据管理。插入操作维护了树的平衡,删除操作需要考虑多种情况以保持树的正确性,而查找操作则利用了树的有序性实现快速定位。在实际应用中,二叉查找树常...

    二叉查找树的C语言实现——插入,删除,查找

    这样的特性使得在二叉查找树中进行查找、插入和删除操作时效率较高。 在C语言中实现二叉查找树,我们需要定义一个结构体来表示树节点,包含节点的值以及指向左右子节点的指针。例如: ```c typedef struct Node { ...

Global site tag (gtag.js) - Google Analytics