Java:二进制搜索树

时间:2016-06-20 15:18:00

标签: java binary-search-tree

我决定使用java创建二进制搜索树,我想要做的是从树中删除 Max 元素,所以我创建了这部分代码:

public Node<T> removeMax(Node<T> node) {
    if (node == null)
        return null;
    if (node.right == null) {
        Node<T> n = node;
        node = null;
        return n;
    }

    return removeMax(node.right);
}

该方法返回 Max 元素,但它不会从树中删除它。如您所见,我试图在此部分删除它:

Node<T> n = node;
node = null;
return n;

但是,当我在树中打印元素时,它会显示&#34;删除&#34;也是。 我做错了什么?

编辑:我真正要做的是删除 Max 节点并将其返回,以便我现在可以删除哪一个。

2 个答案:

答案 0 :(得分:0)

现在,我注意到您想知道删除哪个节点。您所要做的就是删除最大节点并打印树:

 public void deleteMax(Node<T> root) { 
         Node<T> current = root;
         while (current.right.right != null) { 
             current = current.right; 
         } 
         if(current.right.left!=null) {//max has 1 child to left
             current.right=current.right.left;
         }
         else {//max has no child
             current.right=null;
         }
     }

public String printInfix(Node<T> root) {//prints all the data in the tree in infix order

   if(root==null) {
        return "";
   }

 return printAll(root.left+" "+root.data+" "+printAll(root.right);
}

答案 1 :(得分:0)

您要删除二进制搜索树中的节点。因此,基本上您想做的是使其无法访问。为此,您必须取消对其的引用,即,将其父对象的指向它的相应指针设置为null。

更改此:

if (node.right == null) {
    Node<T> n = node;
    node = null;
    return n;
}

对此:

if (node.right.right == null) {
    Node<T> n = node.right;
    node.right = node.right.left;
    return n;
}

此外,当根是树的最大元素时,您还需要注意这种情况。因此,如果您对BST的根有一些参考,请在上述情况之前添加此情况:

if (node.right == null) {
    Node<T> n = node;
    referenceToTheRootOfBST = node.left;
    return n;
}

如果没有对BST根目录的引用,您可以做的是深度复制根目录的左节点,然后删除左节点。因此,以上情况变为:

if (node.right == null) {
    Node<T> n = node;
    //I'll assume you don't call this function if root is the only element.
    //if root is the only element.If that's the case, then just make the 
    //root null before calling this function.
    Node<T> leftNode = node.left;
    node.value = leftNode.value;
    node.left = leftNode.left;
    node.right = leftNode.right;
    return n;
}

处理root是最大元素的另一种简单方法是在实际调用此函数之前对其进行检查。只需检查root是否具有正确的节点,如果没有,则重新分配root引用。

相关问题