2017-11-02 3 views
0

礼拝コミュニティので、辛抱してください、バイナリ検索房

これは概念的な質問の詳細ですで再帰の周り私の頭をラップするように見えることはできません。

私はバイナリツリーのトラバースにおける複数回の再帰と操作の順序のために、次のアルゴリズムと混乱します。私は例として Preorderアルゴリズムを使っています。

コードを強調します。

1 public static void Preorder(Node node){ 
2 if (node == null) 
3  return; 
4 System.out.print(node.element + " "); 
5 Preorder(node.left); 
6 Preorder(node.right); 
7 } 

私が混乱しているのは、再帰呼び出しのコマンドチェーンです。 最初の「反復」のアルゴリズムでは、両方とも、同時にアクティブ化されたときに呼び出されるPreorderメソッドです。 5行目と6行目のメソッドが同時に起こるのと同じように、もう一方のメソッドが完了するのを待つこともありません。

それは#6 Prerder()のように、ベースケースがヒットするまで呼び出され続けます。 #7はベースがヒットするまで呼び出されますか?これが本当であれば、どのようにサブツリーの左側のすべての右ノードに到達し、その逆もありますか?

は、メソッドが常にノードを繰り返している場合、どのように正確なアルゴリズムは、右側のサブツリー上のこれらの権利ほとんどのノードに「達する」ん

N 
/\ 
    N N 
/\ \ 
N N N 
    \ 
    N 
    /\ 
    N N 
    /
    N 

あなたはこの、木(N =任意の数)を持っていると言います。左の議論?それはあなたが左のほとんどのノードだけを取得し、他のものは取得しないように見えます。

私はまだ、nodes.leftとnodes.rightの概念と、再帰と他のアルゴリズムがそれらを効果的にどのように使用しているかという概念を頭で捉えています。潜在的なプロセスのように見えますが、少なくとも魅力的です。

+0

'Preorder'への再帰呼び出しもそれぞれの' left'と 'right'を反復しようとしていますサブツリーはすべてのノードにアクセスします。 – 4castle

+0

どのようにですか? @ 4castleは、その反復関数があるかのように、またはそうでない限り(ここで間違っている場合は私を修正してください)。 Preorder(node.left)は、Preorder(node.left)とPreorder(node.right)を同時に呼び出します。したがって、その同時の再帰呼び出しがその時です。 – TheDeezer

+0

この場合、「配列の要素を反復処理する」の代わりに、「反復」という単語を使用して「オブジェクトのフィールドを反復する」を参照しています。最初に 'Preorder(node.left);'を呼び出し、 'Preorder(node.right);'を呼び出します。彼らは同時ではありません。 2番目のステートメントは、最初のステートメントが終了するまで開始しません。 – 4castle

答えて

1

百聞は一見にしかずです:これは先行予約時に各ステップの番号に起こる:

1 
/\ 
    2 9 
/\ \ 
3 4 10 
    \ 
    5 
    /\ 
    6 7 
    /
    8 
関連する問題