给定 BST 和 BST 中的节点,将该节点作为树的新根 . 但是在将此节点设置为root之后仍然将树维护为 BST .
BST
我尝试如下:将给定节点作为根,如果它在原始根的左侧,则将原始根作为其右子,并将原始根的子节点作为新根的左子节点(类似地,如果新根在原始右侧)根) . 现在,有两种情况:
如果节点(新根在原始结构中的位置)是叶子,那么根本不用担心
问题是当节点(新根在原始结构中的位置)是内部节点时,那么可以做什么?
在一般情况下,您的算法需要以子树旋转的形式执行一系列树操作(如@ Quicky的答案中所述) .
该算法应如下所示:
虽然node_to_be_root不是整个树的根:
旋转子树,其中node_to_be_root是枢轴,其父节点是子树的根(在此旋转之后,node_to_be_root将成为子树的根) .
对于案例2,您需要执行树旋转,如here所述
这是我能想到的算法
创建一个内容与节点相同的新节点(必须成为新节点)
将新节点内容与当前根节点进行比较 .
2.1 . 如果它更大,那么将当前节点作为它的左子项,否则为右子项
2.2还根据条件1将当前根节点的另一个子节点作为新节点的子节点
To delete the node here is the algo
要删除的节点是leaf:只需从树中删除即可 .
要删除的节点只有一个子节点:将子节点复制到节点并删除子节点
要删除的节点有两个子节点:查找顺序(这里表示查找要删除节点的右子节点的最后一个左子节点)节点的后继节点 . 将inorder继承者的内容复制到要删除的节点,然后最终删除最后一个左子节点 .
在http://quiz.geeksforgeeks.org/binary-search-tree-set-2-delete/更好地解释删除节点
3 回答
在一般情况下,您的算法需要以子树旋转的形式执行一系列树操作(如@ Quicky的答案中所述) .
该算法应如下所示:
虽然node_to_be_root不是整个树的根:
旋转子树,其中node_to_be_root是枢轴,其父节点是子树的根(在此旋转之后,node_to_be_root将成为子树的根) .
对于案例2,您需要执行树旋转,如here所述
这是我能想到的算法
创建一个内容与节点相同的新节点(必须成为新节点)
将新节点内容与当前根节点进行比较 .
2.1 . 如果它更大,那么将当前节点作为它的左子项,否则为右子项
2.2还根据条件1将当前根节点的另一个子节点作为新节点的子节点
To delete the node here is the algo
要删除的节点是leaf:只需从树中删除即可 .
要删除的节点只有一个子节点:将子节点复制到节点并删除子节点
要删除的节点有两个子节点:查找顺序(这里表示查找要删除节点的右子节点的最后一个左子节点)节点的后继节点 . 将inorder继承者的内容复制到要删除的节点,然后最终删除最后一个左子节点 .
在http://quiz.geeksforgeeks.org/binary-search-tree-set-2-delete/更好地解释删除节点