• leetcode刷题日记:94. Binary Tree Inorder 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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

  • 相关阅读:
    【Spring Boot 3】【Camel 4】静态路由
    【RocketMQ】顺序消息实现总结
    【Postman&JMeter】使用Postman和JMeter进行signature签名
    出栈序列的合法性
    FreeRTOS简单内核实现6 优先级
    IIS WebDAV配置,https绑定及asp设置
    MVC第三波书店实现用户评论展示
    基于php化妆品销售
    [激光原理与应用-40]:《光电检测技术-7》- 常见光干涉仪及其应用
    Resolume Arena 7.15.0(VJ音视频软件)
  • 原文地址:https://blog.csdn.net/apprentice_eye/article/details/134224209