给定一个 BST 和 BST 中的一个节点,将该节点作为树的新根

Given a BST, and a node in BST, make that node, as new root of the tree

给定一个 BSTBST 中的一个节点,使该节点成为树的新根。但在将此节点设为根节点后仍将树保持为 BST

我试过如下: 以给定节点为根,如果它在原始根的左侧,则将原始根作为它的右侧child,并将原始根的左侧child作为新根的左侧child(类似地,如果新根位于原始根的右侧)。现在,有两种情况:

  1. 如果节点(新根在原始结构中的位置)是叶子,则完全不用担心
  2. 问题是当节点(新根在原始结构中的位置)是内部节点时,可以做什么?

对于情况 2,您需要按照说明执行树轮换 here

在一般情况下,您的算法需要以子树旋转的形式执行一系列树操作(如@Quicky 的回答所述)。

算法应如下所示:

  • 虽然node_to_be_root不是整棵树的根:
    • 旋转子树,其中 node_to_be_root 是枢轴,其父节点是子树的根(旋转后, node_to_be_root 将成为子树的根)。

这是我能想到的算法

  1. 创建一个与节点内容相同的新节点(必须创建一个新节点)
  2. 将新节点内容与当前根节点进行比较。

    2.1。如果它更大,则将当前节点设为它的左 child 否则右 child

    2.2 同时根据条件1

  3. 将当前根节点的另一个child作为新节点的child
  4. 删除我们在步骤 1 中复制的另一个节点

这里删除节点是算法

  1. 要删除的节点是叶子:只需从树中删除即可。
  2. 要删除的节点只有一个child:将child复制到节点,删除child
  3. 要删除的节点有两个children: 查找inorder(这里是指找到最后一个左child of right child of the right child of the to be deleted node)节点的后继者。将inorder successor的内容复制到要删除的节点,然后最终删除最后一个left child..

删除节点在 http://quiz.geeksforgeeks.org/binary-search-tree-set-2-delete/

有更好的解释