1. 程式人生 > 實用技巧 >【leetcode】145. 二叉樹的後序遍歷

【leetcode】145. 二叉樹的後序遍歷

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