2017-02-14 7 views
0

私のプログラムが要素をどのように挿入するかを視覚化するのは難しいです。私は悲しげに理解し、それがツリー内の要素を置く方法を視覚化することができません完全にバランスの取れたツリー内の要素の順序

int arr[] = { 3, -2, 11, 7, 12, 1, 4, 5, 33, 13 }; 
int n = 10; 
int cnt = 0; 

typedef struct node*po; 

struct node { 
    int data; 
    po left; 
    po right; 
}; 

po ibd(int n) { 
    po holder; 
    if (n>0) { 
     int nl = n/2; 
     int nr = n - nl - 1; 
     holder = new node; 
     holder->data = arr[cnt++]; 
     holder->left = ibd(nl); 
     holder->right = ibd(nr); 
     return holder; 
    } 
    else { 
     return NULL; 
    } 
} 

: はここに先生が私たちに与えたコードです。私はそれが再帰的分割と征服アルゴリズムを使用して2つの部分に分割し、要素を追加することを理解することができますが、どの要素がルートになるのか理解できません。すべてが挿入された後、ツリーがどのように見えるかを誰かが視覚化するのを助けることができますか?

+--------------+---------------+ 
|   Data    | 
+--------------+---------------+ 
| Pointer to | Pointer to | 
| left subtree | right subtree | 
+--------------+---------------+ 

私は別のノードのポイントを作るとき、私は新しいノードに適切なleftまたはrightポインタからの矢印を使用します。木を扱う場合

+1

デバッガでコードをステップ実行し、デバッガの機能を確認する必要があります。 – NathanOliver

+1

C++タグではなく、この質問にcタグを使用することを検討する必要があります。 –

+1

教師の関数の署名が 'po ibd(int n)'の場合、コードの明快さの未来を恐れます。 – Drax

答えて

0

、私はこのようなノードに何かを描くのが好き。これは私がツリーを視覚化するのに役立ちます。

木を描く方法を示す多くのリソースがあります。

ツリーが描画されたら、新しいノードを追加するときに矢印に従います。

+0

はい、私はそれを理解することができますどのように木を描画するが、私はこの正確な例で問題があります。私は配列が{3、-2、11、7、12、1、4、5、33、13}と言うことができます。関数は、配列を2:n/2とn - n/2 - 1に分割します。したがって、私は{3、-2、11、7、12、1}と{4,5、 33,13}。しかし、どの要素が自分の根になるのか分かりません。それは1(5hの配列要素、n/2 = 5なので)、それから他のものを左右どちらかに置くか、何か間違っていますか?誰かが私にこの現実の例を書いたとしても、どのように動作するのか本当に分かりました。 –

+0

'cnt'が0で' arr [0] == 3'であるため、 'holder-> data = arr [cnt ++];'のように、ルートデータは3です。 –

+0

私はこの機能を無効にして、あなたが理解しているバイナリツリービルダーを作成することをお勧めします。 –

関連する問題