2016-06-30 3 views
-1

次の入力ツリーでセグメント化エラーが発生するというエラーを見つけるのを手伝ってください。 「-1」はnullを表します。このコードは小さな入力とローカルのputのためにうまく働いていますが、私が提出するためにオンラインになると、セグメンテーション違反が起こります。私の理解を助けてください。preorder traversal cで再帰なし

struct TreeNode { 
     int val; 
     struct TreeNode *left; 
     struct TreeNode *right; 
}; 

typedef struct TreeNode treenode; 
treenode* treenode_new(int val) { 
     treenode* node = (treenode *) malloc(sizeof(treenode)); 
     node->val = val; 
     node->left = NULL; 
     node->right = NULL; 
     return node; 
} 
typedef struct stack { 
    unsigned capacity; 
    int top; 
    treenode **array; 

}Stack; 

Stack * createStack(unsigned capacity){ 
    Stack * stack= (Stack*)malloc(sizeof(Stack)); 
    stack->capacity = capacity; 
    stack->top=-1; 
    stack->array = (treenode**)malloc(capacity*sizeof(treenode*)); 
} 
int isFull(Stack * stack){ 
    return stack->top==stack->capacity-1; 
} 
int isEmpty(Stack * stack){ 
    return stack->top==-1; 
} 
void push(Stack * stack , treenode * item){ 
    if(isFull(stack)){ 
     return; 
    } 
    stack->array[++stack->top]= item; 
} 
treenode * peek(Stack * stack){ 
    if(isEmpty(stack)){ 
     return NULL; 
    } 

    return stack->array[stack->top]; 
} 
treenode * pop(Stack * stack){ 
    if(isEmpty(stack)){ 
     return NULL; 
    } 
    treenode *node = stack->array[stack->top--]; 

    return node; 
} 

int* preorderTraversal(treenode* A, int *len1) { 
    if(A==NULL){ 
     *len1=0; 
     return NULL; 
    } 
    int* Arr = (int *)malloc(5000*sizeof(int)); 
    Stack *s= createStack(5000); 
    push(s, A); 
    int i =0; 
    treenode *temp; 
    while(!isEmpty(s)){ 
     temp = pop(s); 
     Arr[i++]=temp->val; 

     if(temp->right){ 
      push(s,temp->right); 
     } 
     if(temp->left){ 
      push(s , temp->left); 
     } 

    } 
    *len1= i; 
    return Arr; 
} 

入力:あなたはあなたがcreateStackからstack割り当てられ戻らずに、あなたが

メイン
Stack *s= createStack(5000); 
でそれを受けているようになっていた stackを返すのを忘れて

359 129 97 98 93 106 27 61 -1 173 40 78 22 152 99 114 47 69 -1 -1 110 144 14 56 165 174 49 1 57 126 123 100 30 -1 -1 -1 161 13 139 2 85 128 119 177 -1 169 135 77 112 50 17 140 138 58 -1 -1 105 -1 -1 -1 -1 70 -1 -1 102 -1 -1 103 -1 176 -1 -1 115 132 154 125 5 -1 108 36 32 7 -1 -1 148 -1 153 16 130 72 -1 -1 95 116 48 104 -1 -1 20 156 -1 -1 88 -1 142 175 -1 64 133 83 94 -1 4 71 101 -1 -1 -1 -1 42 -1 -1 -1 -1 134 166 28 92 33 82 74 45 -1 -1 168 -1 9 -1 44 26 -1 -1 170 6 -1 -1 89 143 160 -1 68 178 111 167 -1 109 151 -1 -1 -1 81 23 -1 -1 -1 -1 -1 -1 66 11 10 179 15 96 -1 127 18 163 -1 -1 24 29 -1 -1 -1 -1 -1 34 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 21 118 -1 31 -1 35 -1 37 -1 122 162 3 -1 -1 -1 121 59 -1 -1 -1 19 158 157 -1 171 84 46 149 -1 -1 -1 -1 76 147 54 150 -1 -1 -1 -1 63 62 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 86 43 55 -1 -1 -1 -1 172 120 -1 -1 91 155 8 107 -1 -1 -1 164 -1 -1 113 -1 73 137 -1 -1 39 -1 -1 41 -1 -1 -1 75 146 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 90 -1 145 -1 -1 117 51 -1 -1 136 -1 79 80 -1 53 52 -1 -1 -1 159 -1 -1 -1 60 -1 -1 -1 131 -1 38 12 -1 -1 -1 -1 124 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 67 65 -1 87 -1 25 -1 141 -1 -1 -1 -1 
+4

このコードは完全ではありません。あなたの質問を[最小、完全で、証明可能な例](http://stackoverflow.com/help/mcve)で更新してください。 – dbush

+0

https://www.interviewbit.com/problems/preorder-traversal/実際の問題はこちらです。上記は私の解決策です。ここでコードを実行してみてください。 –

+0

あなたは 's'によって指し示されたメモリを漏らしています。 –

答えて

1
Stack * createStack(unsigned capacity){ 
    Stack * stack= (Stack*)malloc(sizeof(Stack)); 
    stack->capacity = capacity; 
    stack->top=-1; 
    stack->array = (treenode**)malloc(capacity*sizeof(treenode*)); 
    return stack; //see this 
} 

sを使用すると、が発生します

+0

はい。間違い。しかし、同じ問題が残る。複雑さを改善する方法もありますか? –

+0

@AmitChawla '5000'要素だけでなく、もっと多くのメモリを割り当ててください。 '300000' –