删除二叉树中的节点

时间:2014-06-27 13:35:14

标签: java tree binary-tree binary-search-tree

下面是我为deleteItem位于叶节点时编写的代码。即使我将找到的叶节点等同于" null"然后当我打印顺序遍历顺序如果树,该元素没有被删除并出现在屏幕上。我错过了什么?

public void deleteNode(T deleteItem)
    {
        TreeNode<T> node = root;
        if(root == null)
        {
            System.out.print("Binary Tree does not exist");
            System.exit(0);
        }
        while((node.data != deleteItem) && (node.leftNode != null || node.rightNode != null))
        {
            if(deleteItem.compareTo(node.data)<0)
                node = node.leftNode;
            else
                node = node.rightNode;
        }
        //System.out.printf("deleting item is: %s\n", node.data);
        if(node.data != deleteItem)
        {   
            System.out.println("\ndeleteItem not found in the tree");
            System.exit(0);
        }
        else
        {
            if(node.leftNode == null && node.rightNode == null)
            {
                node = null;
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

Java是"Pass-by-value", 所以TreeNode<T> tmp = root在这里意味着为tmp分配root的引用,这意味着您只需要对同一个实例有两个不同的引用。 根据这一点,当您说node = null时,您将本地引用设置为null,这意味着节点的父级仍然引用它。 因此,要从树中删除叶节点,您需要跟踪其父节点,然后删除对节点的引用(删除树中的引用而不是本地副本),这将是这样的:

public void deleteNode(T deleteItem) {
        TreeNode<T> node = root;
        TreeNode<T> parent = null; // parent of the deleted node.
        if(root == null) {
            System.out.print("Binary Tree does not exist");
            System.exit(0);
        }
        while((node.data != deleteItem) && 
              (node.leftNode != null || node.rightNode != null)) {
            parent = node; // keep track of the parent of the deleted node
            if(deleteItem.compareTo(node.data) < 0)
                node = node.leftNode;
            else
                node = node.rightNode;
        }
        if(node.data != deleteItem) {   
            System.out.println("\ndeleteItem not found in the tree");
            System.exit(0);
        }
        else {
            if(parent.leftNode == node)
                parent.leftNode = null;
            else
                parent.rightNode = null;
        }
    }