当编写简单的二叉搜索树数据结构(非自平衡)时,大多数资源在删除具有两个子节点的节点时给出的建议是将数据从左子节点之一复制到正在删除的节点。这是不好的做法吗?某种指针操作不会提供更快的结果吗?是否有可以概括的BST旋转算法?
答案 0 :(得分:1)
是的,您不想复制节点,只是想“移动”它(即更改指针)将其放入您要删除的节点。如果你不想保持平衡,你实际上不需要进行任何类型的旋转 - 你只需选择左子树中最右边的节点(或右子节点中最左边的节点) -树)。您从当前位置删除它,并将其插入您需要删除的节点的位置(严格地通过操纵指针)。
答案 1 :(得分:0)
复制数据在操作指针时具有O(1)复杂度与可能的O(N):源节点(左子树中最右边的节点或右子树中最左边的节点)可能有一个孩子和一个子树。与单个节点插入不同,在这种情况下将需要合并子树。为避免复制开销,应该存储指向对象的指针而不是BST中的对象。