删除二叉树 - 设计建议

时间:2012-08-08 14:06:26

标签: java recursion tree binary-tree

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

  1. 在reverseTreeStack方法中,我可以不使用堆栈方法参数进行设计吗?
  2. 我可以用更好的设计在1种方法中设计整个代码吗?
  3. 更新:将reverseTreeStack的返回类型更改为void.Removed附加变量用于堆栈。

        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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

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

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

另请查看Postorder Traversal(这是唯一可用于删除的内容)

答案 2 :(得分:1)

如果你的树太大,你的reverseTreeStack方法可能会给你StackOverflowError,所以使用循环代替递归可能有更好的选择(除非你知道你的事实是树永远不会那么大。)

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

答案 3 :(得分:1)

1)我认为您可以终止返回值并使其成为一个void方法,因为您正在直接操作堆栈。所以就这样做

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

 // Now just use stack

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