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

时间:2015-05-27 06:50:46

标签: algorithm data-structures tree binary-search-tree

给定BSTBST中的节点,将该节点作为树的新根。但是在将此节点设置为root之后仍然将树维护为BST

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

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

3 个答案:

答案 0 :(得分:0)

对于案例2,您需要按照here

所述执行树旋转

答案 1 :(得分:0)

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

算法应如下所示:

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

答案 2 :(得分:0)

这是我能想到的算法

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

    2.1。如果它更大,那么将当前节点作为它的左子项,否则为右子项

    2.2同时根据条件1将当前根节点的另一个子节点作为新节点的子节点

  3. 删除我们已在步骤1中制作副本的其他节点
  4. 此处删除节点是算法

    1. 要删除的节点是leaf:只需从树中删除。
    2. 要删除的节点只有一个子节点:将子节点复制到节点并删除子节点
    3. 要删除的节点有两个子节点:查找顺序(这里表示查找要删除节点的右子节点的最后一个左子节点)节点的后继节点。将inorder继承者的内容复制到要删除的节点,然后最终删除最后一个左子..
    4. http://quiz.geeksforgeeks.org/binary-search-tree-set-2-delete/

      更好地解释了删除节点的问题