void addPath(int *vec, int *vecSize, struct TreeNode *node) { int count = 0; while (node != NULL) { ++count; vec[(*vecSize)++] = node->val; node = node->right; } for (int i = (*vecSize) - count, j = (*vecSize) - 1; i < j; ++i, --j) { int t = vec[i]; vec[i] = vec[j]; vec[j] = t; } } int *postorderTraversal(struct TreeNode *root, int *returnSize) { int *res = malloc(sizeof(int) * 2001); *returnSize = 0; if (root == NULL) { return res; } struct TreeNode *p1 = root, *p2 = NULL; while (p1 != NULL) { p2 = p1->left; if (p2 != NULL) { while (p2->right != NULL && p2->right != p1) { p2 = p2->right; } if (p2->right == NULL) { p2->right = p1; p1 = p1->left; continue; } else { p2->right = NULL; addPath(res, returnSize, p1->left); } } p1 = p1->right; } addPath(res, returnSize, root); return res; }
int *postorderTraversal(struct TreeNode *root, int *returnSize) { int *res = malloc(sizeof(int) * 2001); *returnSize = 0; if (root == NULL) { return res; } struct TreeNode **stk = malloc(sizeof(struct TreeNode *) * 2001); int top = 0; struct TreeNode *prev = NULL; while (root != NULL || top > 0) { while (root != NULL) { stk[top++] = root; root = root->left; } root = stk[--top]; if (root->right == NULL || root->right == prev) { res[(*returnSize)++] = root->val; prev = root; root = NULL; } else { stk[top++] = root; root = root->right; } } return res; }