2011-07-31 9 views
0

プログラムがツリーの最初の3文字だけを印刷している理由を理解できません。 助けてください。pre_order cでスタックを使用したトラバーサル

私はコンパイル

char stack[30]; 

は、他の問題があるかもしれません

struct node* stack[30]; 

で交換する必要があること。驚い

#include <stdio.h> 
#include <malloc.h> 

struct node 
{ 
    struct node *left; 
    char data; 
    struct node *right; 
}; 

struct node *buildtree(int); 
void pre_order(struct node*); 

char a[]={'a','b','c','d','e','f','g','\0','\0','h','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'}; 

int main() 
{ 
    struct node *root; 
    root = buildtree(0); 
    printf("pre order traversal:\n"); 
    pre_order(root); 
} 

struct node *buildtree(int n) 
{ 
    struct node *temp = NULL; 
    if(a[n]!='\0') 
    { 
     temp=(struct node*)malloc(sizeof(struct node)); 
     temp->left=buildtree(2*n+1); 
     temp->data=a[n]; 
     temp->right=(2*n+2); 
    } 

    return temp; 
} 

void pre_order(struct node* root) 
{ 
    char stack[30]; 
    struct node* ptr; 
    int top=1; 
    stack[1]=NULL; 
    ptr=root; 

    while(ptr!=NULL) 
    { 
     printf("%c",ptr->data); 
     if(ptr->right!=NULL) 
     { 
      top=top+1; 
      stack[top]=ptr->right; 
     } 

     if(ptr->left!=NULL) 
      ptr=ptr->left; 
     else 
     { 
      ptr=stack[top]; 
      top=top-1; 
     } 
    } 
} 
+0

ようこそstackoverflow。 1分ほどで[FAQ](http://stackoverflow.com/faq)をお読みください。質問を編集して(1)あなたが試したこと、(2)あなたが得ているエラーを追加してください。これが宿題であれば、 '宿題'タグを付け加えてください。 –

答えて

3

ツリーを構築するために素早く再帰的なルーチンを書いたのですが、プリオーダートラバーサルを行うための再帰ルーチンを作成してみませんか?理解するのがはるかに簡単です。

+0

:すごく感謝しています,,,,今、働いています、私は大失敗をしました、指摘してくれてありがとう。私は再帰的なルーチンを試していた,,,それは簡単に働いたが、私はそれをスタックを使用して実装したい。 – sandyroddick

1

単に「スタック」という名前を呼び出しても、それが1つとして動作することはありません。何かをスタックにプッシュすると、既存の値がプッシュダウンされ、その逆はポップするために真です。

私は作業スタックの実装から始めたいと思います。好ましくは、プッシュとポップ用の独自の関数を使用します。

+0

私は同意する、スタックは、まず抽象化する必要があります。 – phoxis

関連する問題