给定一个 BST 和 BST 中的一个节点,将该节点作为树的新根
Given a BST, and a node in BST, make that node, as new root of the tree
给定一个 BST
和 BST
中的一个节点,使该节点成为树的新根。但在将此节点设为根节点后仍将树保持为 BST
。
我试过如下:
以给定节点为根,如果它在原始根的左侧,则将原始根作为它的右侧child,并将原始根的左侧child作为新根的左侧child(类似地,如果新根位于原始根的右侧)。现在,有两种情况:
- 如果节点(新根在原始结构中的位置)是叶子,则完全不用担心
- 问题是当节点(新根在原始结构中的位置)是内部节点时,可以做什么?
对于情况 2,您需要按照说明执行树轮换 here
在一般情况下,您的算法需要以子树旋转的形式执行一系列树操作(如@Quicky 的回答所述)。
算法应如下所示:
- 虽然node_to_be_root不是整棵树的根:
- 旋转子树,其中 node_to_be_root 是枢轴,其父节点是子树的根(旋转后, node_to_be_root 将成为子树的根)。
这是我能想到的算法
- 创建一个与节点内容相同的新节点(必须创建一个新节点)
将新节点内容与当前根节点进行比较。
2.1。如果它更大,则将当前节点设为它的左 child 否则右 child
2.2 同时根据条件1
将当前根节点的另一个child作为新节点的child
- 删除我们在步骤 1 中复制的另一个节点
这里删除节点是算法
- 要删除的节点是叶子:只需从树中删除即可。
- 要删除的节点只有一个child:将child复制到节点,删除child
- 要删除的节点有两个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/
有更好的解释
给定一个 BST
和 BST
中的一个节点,使该节点成为树的新根。但在将此节点设为根节点后仍将树保持为 BST
。
我试过如下: 以给定节点为根,如果它在原始根的左侧,则将原始根作为它的右侧child,并将原始根的左侧child作为新根的左侧child(类似地,如果新根位于原始根的右侧)。现在,有两种情况:
- 如果节点(新根在原始结构中的位置)是叶子,则完全不用担心
- 问题是当节点(新根在原始结构中的位置)是内部节点时,可以做什么?
对于情况 2,您需要按照说明执行树轮换 here
在一般情况下,您的算法需要以子树旋转的形式执行一系列树操作(如@Quicky 的回答所述)。
算法应如下所示:
- 虽然node_to_be_root不是整棵树的根:
- 旋转子树,其中 node_to_be_root 是枢轴,其父节点是子树的根(旋转后, node_to_be_root 将成为子树的根)。
这是我能想到的算法
- 创建一个与节点内容相同的新节点(必须创建一个新节点)
将新节点内容与当前根节点进行比较。
2.1。如果它更大,则将当前节点设为它的左 child 否则右 child
2.2 同时根据条件1
将当前根节点的另一个child作为新节点的child
- 删除我们在步骤 1 中复制的另一个节点
这里删除节点是算法
- 要删除的节点是叶子:只需从树中删除即可。
- 要删除的节点只有一个child:将child复制到节点,删除child
- 要删除的节点有两个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/
有更好的解释