2016-09-22 5 views
0

メソッドが呼び出されるたびに1にリセットされるので、合計がどのようにインクリメントされているのか分かりません。私は、メモリがスタックに格納されていることを知っていますが、実際の合計がどこで発生するのかわかりません。また、変数の合計がメソッドの内部で宣言され、メソッドの外ではなく宣言されたときに、どれだけのメモリが節約されるか。このメソッドはどのようにしてすべてのBSTノードのサイズを追加しますか?

private int size(BSTNode current) { 
     if (current == null) { 
      return 0; 
     } 
    int sum = 1; 
    sum += size(current.getLeft()); 
    sum += size(current.getRight()); 
    return sum; 
    } 

答えて

0

あなたは会社の部門長として参加し、その部門で働いている人の総数を知りたいとします。また、エンジニアリング部門とビジネス部門の役員が2名あります。今、人々の数を数えるために、あなたはオフィスを回ってカウントすることができます。 (しかし、それは退屈であり、また、部門の長であることのポイントは何ですか?

または、あなたのエンジニアリングヘッドに、彼の下で働いている人々を見つけるように頼んでください。例えば、xとビジネスヘッドに彼の下で働く人々、例えばyを見つけてください。したがって、部門で働く人の総数はx+y+1(1人があなたのためです)です。

エンジニアリングヘッドが彼の下に2人の監督者を持ち、各監督者が監督している人の数を調べるよう依頼することができます。したがって、エンジニアリングチームの人数は、people_under_supervisor_1 + people_under_supervisor_2 + 1(エンジニアリングヘッド1人)です。等々。

同様に、事業部門の人数をビジネスヘッドで把握する場合も同様です。このコードは、同じことをやっている

左サブツリーの大きさを見つけ、右部分木の大きさを見つけ、現在のノードのための1を追加。 アルゴリズムがどのように動作しているかを示します。私はこの類推が助けてくれることを望みます今

、「変数の和は法の外ではなく、メソッドの中で宣言されたときに多くのメモリが保存されているどのくらいの。」をあなたがローカル変数を宣言するとき 実際より多くのメモリが使用されているについて再帰関数。ローカル変数を宣言すると、スタック内にメモリ位置が割り当てられ、そのローカル変数のスコープが完了するまでそのメモリ位置を他の目的で使用することはできません。したがって、次の関数がsize(current.getLeft())と呼ばれると、すべての変数がスタックに残り、ローカル変数sizeの新しいメモリ位置がsize(current.getLeft())を呼び出して作成されます。関数がまだ返されない限り、sizeのインスタンスはメモリに残ります。

このビデオをご覧ください。https://www.youtube.com/watch?v=_8-ht2AKyH4スタックの明確なアイデアを得るには、このビデオをご覧ください。

0

あなたのコードは何:

int sum = 1;      // +1 for current node 
sum += size(current.getLeft()); // +size of leftSubtree of current node 
sum += size(current.getRight()); // +size of rightSubtree of current node 

あなたは1がそれぞれのために行われ、それが上がるように、ルートからリーフノードまでの各ノードにダウンして、下から戻って戻ってきていますノード

実際にノード数をカウントしようとすると、変数名sumの使用は誤解を招きます。 countまたはnode_countのような名前を使用します。

関連する問題