leetcode刷题日记:94. Binary Tree Inorder Traversal(二叉树的中序遍历)和145. Binary Tree Postorder Traversal(后序遍历)

94. Binary Tree Inorder Traversal(二叉树的中序遍历)

给出二叉树的根结点,返回二叉树的中序遍历序列。
二叉树的中序遍历序列是先遍历左子树再遍历根结点然后再遍历右子树,在遍历左子树是这个结点是左子树的根结点,左子树有左子树和根结点右子树,也就是说在遍历的时候我们要递归遍历。
在递归遍历中我们需要不断的进行分配空间与释放空间,然后我们在这个过程中不断的进行序列的合并,在合并的过程中需要我们注意的是合并的顺序是左子树、根结点、右子树,同时在合并之后要将合并后的returnSize计算出来。
在这一个二叉树的中序遍历中有一点那个归并排序的感觉,将问题分解成小问题后得到答案然后再答案合并,非常像,不知道大家有没有这一种感觉。

int * inorderTraversal(struct TreeNode * root, int *returnSize){
    if(root!=NULL){
        int *left = inorderTraversal(root->left, returnSize);
        int leftLength = *returnSize; 
        int *right = inorderTraversal(root->right, returnSize);
        int rightLength = *returnSize;
        int num = leftLength + rightLength;
        int *answer = (int *)malloc(sizeof(int)*(num+1));
        int k = 0;
        for(int i=0; i<leftLength; i++){
            answer[k++] = left[i];
        }
        answer[k++] = root->val;
        for(int i=0; i<rightLength; i++){
            answer[k++] = right[i];
        }
        free(left);
        free(right);
        left = NULL;
        right = NULL;
        *returnSize = num+1;
        return answer;
    }
    *returnSize = 0;
    return NULL;
}

运行结果截图:
在这里插入图片描述

145. Binary Tree Postorder Traversal(后序遍历)

二叉树的前序后序中序遍历都非常类似,只是对于根结点的访问顺序发生改变,我们可以出如下代码:

int* postorderTraversal(struct TreeNode* root, int* returnSize) {
    if(root!=NULL){
        int *left = postorderTraversal(root->left, returnSize);
        int leftLength = *returnSize; 
        int *right = postorderTraversal(root->right, returnSize);
        int rightLength = *returnSize;
        int num = leftLength + rightLength;
        int *answer = (int *)malloc(sizeof(int)*(num+1));
        int k = 0;
        for(int i=0; i<leftLength; i++){
            answer[k++] = left[i];
        }
        for(int i=0; i<rightLength; i++){
            answer[k++] = right[i];
        }
        answer[k++] = root->val;
        free(left);
        free(right);
        left = NULL;
        right = NULL;
        *returnSize = num+1;
        return answer;
    }
    *returnSize = 0;
    return NULL;
}

运行结果截图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值