次の入力ツリーでセグメント化エラーが発生するというエラーを見つけるのを手伝ってください。 「-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
このコードは完全ではありません。あなたの質問を[最小、完全で、証明可能な例](http://stackoverflow.com/help/mcve)で更新してください。 – dbush
https://www.interviewbit.com/problems/preorder-traversal/実際の問題はこちらです。上記は私の解決策です。ここでコードを実行してみてください。 –
あなたは 's'によって指し示されたメモリを漏らしています。 –