4

我写了一个代码来删除树的所有元素。需要以下建议:

  1. 在 reverseTreeStack 方法中,我可以不使用堆栈方法参数进行设计吗?
  2. 我可以用一种更好的设计方法设计整个代码吗?

更新:将 reverseTreeStack 的返回类型更改为 void。删除了堆栈的附加变量。

    public class DeleteTree {

    public static void deleteTree(BinaryTreeNode root)
    {       
        Stack stack = new Stack();
        reverseTreeStack(stack, root);
        while (!stack.isEmpty())
        {
            BinaryTreeNode node = (BinaryTreeNode)stack.pop();
            System.out.println("---------Deleting----------->" + node.getData());
            node = null;
        }
    }

    public static void reverseTreeStack(Stack stack,BinaryTreeNode root)
    {
        if (root != null)
        {
            stack.push(root);   
            reverseTreeStack(stack,root.getLeft());
            reverseTreeStack(stack, root.getRight());
        }
    }
}
4

4 回答 4

2

为什么需要这样做?如果我没记错的话,一旦没有可用的资源引用,JVM 就可以释放资源,因此只需将根节点设置为 null 就可以释放整个树。

于 2012-08-08T14:15:45.710 回答
2

我认为,James 是对的,但是如果你想练习树遍历,或者如果你想用一种需要手动释放内存的语言来实现它,那么使用递归:

void deleteTree(TreeNode node)
{
    if(node==null)return;

    deleteTree(node.getLeft());
    deleteTree(node.getRight());

    System.out.printline("Deleting: "+node.getData())
    node = null;
}

还要看看Postorder Traversal(这是唯一的,适用于删除)

于 2012-08-08T14:26:45.347 回答
1

好吧,如果您的树太大,您的reverseTreeStack方法可能会给您一个StackOverflowError错误,因此使用循环而不是递归可能是更好的选择(除非您知道您的树永远不会那么大)。

另外,为什么要“删除”每个节点?(node = null实际上只是删除了您在该方法中的引用...)root = null如果您以经典的 Node(parent, leftChild, rightChild) 方式构建它而不存储,通常只是忘记根 () 将删除整个树指向其他任何地方的节点的指针。

于 2012-08-08T14:15:23.317 回答
1

1)我认为您可以在直接操作堆栈时杀死返回值并使其成为 void 方法。所以就这样做

 Stack stack = new Stack();
 reverseTreeStack(stack, root);

 // Now just use stack

2)不要把事情浓缩成一种方法。将事物分解为更多方法将使您的代码更易于导航和理解。每个功能负责的越少,阅读它的人就越有意义。

于 2012-08-08T14:18:13.550 回答