2012-03-12 7 views
-1

バイナリツリーに挿入する方法は、左辺から常に埋められるように再帰的に行う方法はありますか?もちろん誤りである私が書いたコードを次に示します...私は、戻り値をキャストしないでください...あなたの提案を提供してください...再帰のビットが弱いバイナリツリーに挿入する

void insert(node **root,int n) 
{ 
    node *temp; 
    temp=(node *)malloc(sizeof(node)); 
    temp->data=n; 
    temp->lchild=NULL; 
    temp->rchild=NULL; 
    if(*root==NULL) 
    { 
     *root=temp; 
     return; 
    } 
    if((*root)->lchild==NULL) 
    { 
      (*root)->lchild=temp; 
      return; 
    } 
    if((*root)->rchild==NULL) 
    { 
      (*root)->rchild=temp; 
      return; 
    } 
    insert(&((*root)->lchild),n); 
    insert(&((*root)->rchild),n); 
    return; 
} 
+2

ツリーの要素のバランスをとるためにいくつの要素があるかを知る必要があります。リストを取得するだけです(左→左→左→左など)。 – sje397

+0

ツリーがバランスが取れているか、完全であるか、または検索バイナリツリーであるかどうかを教えてください。挿入ポリシーに違いがあります。 – Matteo

+0

そのバイナリツリーだけです.....したがって、挿入中にバイナリツリーのポリシーを追跡する必要があります。 – mmuttam

答えて

0
  1. 午前Cプログラムではmallocです。
  2. nにはの両方にサブツリーが挿入される可能性があります。
+0

mallocは常にvoidポインタを返すので、mallocの戻り値をキャストする必要があります...はい、両方のサブツリーにnを挿入します....どうすれば変更できますか? – mmuttam

+0

** No ** '#include'エラーがある場合、またはC++コンパイラを使用している場合のみ、そのキャストが必要です。 @ sje397はあなたのコードを修正する際に、上の彼のコメントで良い提案をしています。新しいノードを挿入するサブツリーを両方に入れないようにする必要があります。 –

0

反復方法を試してください。何よりもユーザーによって示唆されているように、uは左>左のようなリストを取得します>左など

あなたは、反復方法で

public void insert(String data) 
{ 
    if(node == null) 
     node = new Node(null,data,null); 
    else 
    { 
     Queue<Node> q = new LinkedList<Node>(); 
     q.add(node); 
     while(q.peek() != null) 
     { 
      Node temp = q.remove(); 
      if(temp.left != null) 
       q.add(temp.left); 
      else 
      { 
       temp.left = new Node(null,data,null); 
       break; 
      } 

      if(temp.right != null) 
      { 
       q.add(temp.right); 
      } 
      else 
      { 
       temp.right = new Node(null,data,null); 
       break; 
      } 
     } 
    } 
} 

をアプローチをワナ場合は、上記のコードは、Javaです。私はC言語で実装するのが簡単だと思います。

関連する問題