バイナリ検索ツリーのカウントを理解します

Sean2148:

私はこのバイナリ検索ツリー方法は、ノードをカウントしている方法を理解する問題を抱えています、しかし私は、私が起こっている正確に何を説明しますものを見つけることができない、オンライン多くの例を見てきました。

次に例を示します。

public int nodes() {
    int leftNodes = 0;

    if (left != null) {
        leftNodes = left.nodes();
    }
    int rightNodes = 0;

    if (right != null) {
        rightNodes = right.nodes();
    }
    return leftNodes + rightNodes + 1;
}

これは私がこの方法のプロセスを理解していますどのように、そして多分誰かが私が間違っているつもりだところ私が理解するのに役立ちます。

  1. 方法は、BTSオブジェクトから自身の外部から呼び出されます。"tree.nodes()など"。
  2. int型leftNodesが宣言され、0に設定されています。
  3. 左ノードが(あると仮定)がある場合、leftNodesの、値は、ノードへの呼び出しの戻り値()に割り当てられます。
  4. 再帰呼び出しが再びゼロにleftNodesを割り当てる、再びノードメソッドを通過します。

leftNodes変数がインクリメントされている場合ので、私は理解していない何がありますか?それだけで再びメソッドを介して再帰ているように思えるが、値は変更されない、と私はleftNodesとrightNodesを参照してくださいどのように常に0になります。

私は、BTSカウント、Cを使用して、この1の他の例を見つけ++

int CountNodes(node*root)
{
if(root==NULL)
    return 0;
if(root->left!=NULL)
{
    n=n+1;
    n=CountNodes(root->left);
}
if(root->right!=NULL)
{
    n=n+1;
    n=CountNodes(root->right);
}
return n;
}

私は、nが明確に毎回インクリメントされているように、ノードが発見され、従うことがはるかに簡単にこの方法を見つけます。

私の質問はleftNodes / rightNodes値は、再帰呼び出しでインクリメントされている方法ですか?

彼らは次のとおりでした:

あなたは再帰の終了について考える必要があります。

あなたが子を持たない単一のノードがあるとします。

両方leftrightなりますnullので、あなたには、再帰呼び出しを行いません。

あなたは戻ります

leftNodes + rightNodes + 1; // 0 + 0 + 1 == 1

さて、あなたはルート、左の子と右の子で構成され、単純なツリーがあるとします。

あなたが呼び出すとnodes()、そのツリーのルートのために、両方leftrightヌルではありませんので、我々は両方の電話するよleft.nodes()とをright.nodes()左と右の子供の両方がリーフノード(すなわち、彼らは子を持たない)であるため、両方のための再帰呼び出しは、上記のように説明し、1を返します。

再帰呼び出しが戻ったときにそのため、我々は戻ります

leftNodes + rightNodes + 1; // 1 + 1 + 1 == 3

これは私たちのツリー内のノード数です。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=225021&siteId=1