4

ツリーのすべての要素を削除するコードを作成しました。次の提案が必要です。

  1. reverseTreeStack メソッドで、stack メソッドのパラメータを使わずに設計できますか?
  2. コード全体を 1 つのメソッドでより良い設計で設計できますか?

UPDATE : 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

ジェームズは正しいと思いますが、ツリートラバーサルを練習したい場合、またはメモリを手動で解放する必要がある言語でこれを実装したい場合は、再帰を使用してください。

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)を忘れるだけで、ノード(親、左子、右子)の従来の方法で構造化し、保存しない場合、ツリー全体が削除されます他の場所のノードへのポインター。

于 2012-08-08T14:15:23.317 に答える
1

1)スタックを直接操作しているため、戻り値を強制終了してvoidメソッドにすることができると思います。だからただする

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

 // Now just use stack

2) 物事を 1 つの方法に凝縮しないでください。物事をより多くのメソッドに分割すると、コードをナビゲートして理解しやすくなります。各機能の責任が少ないほど、それを読んでいる人にとってより意味のあるものになります。

于 2012-08-08T14:18:13.550 に答える