预先遍历c遍历而不递归

时间:2016-06-30 13:16:32

标签: c data-structures binary-tree

请帮我找出它为以下输入树提供分段错误的错误。 “-1”表示空。代码适用于小输入和大量输入本地但是当我上线提交时它会给出分段错误。请帮我理解。

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;
}

输入:

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 

1 个答案:

答案 0 :(得分: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
 }

您忘记在主

中收到您应该收到的stack
  Stack *s= createStack(5000);

如果不从stack返回已分配的createStack,则使用s会导致segmentation fault