LeetCode·二叉树前序、中序、后序遍历·递归

链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/solution/by-xun-ge-v-5hj0/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

题目LeetCode·二叉树前序、中序、后序遍历·递归_第1张图片

 

LeetCode·二叉树前序、中序、后序遍历·递归_第2张图片 

LeetCode·二叉树前序、中序、后序遍历·递归_第3张图片 

思路

解题思路
每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法:

  • **确定递归函数的参数和返回值:**确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
  • **确定终止条件:**写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
  • **确定单层递归的逻辑:**确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

具体实现

  • **确定递归函数的参数和返回值:**因为要打印出前序遍历节点的数值,所以参数里第一个肯定是需要树的头结点,还需要传入res存放节点的数值和res对于的下标记录存放到数组的那一个位置,除了其他就不需要在处理什么数据了也不需要有返回值,所以递归函数返回类型就是void,代码如下:

void preorder(struct TreeNode* root, int* res, int* resSize)

  • **确定终止条件:**在递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要要结束了,所以如果当前遍历的这个节点是空,就直接return,代码如下: 

if (root == NULL) return;

  • **确定单层递归的逻辑:**前序遍历是根左右的顺序,中序遍历是左根右的顺序,后序是左右根的顺序,所以在单层递归的逻辑,是要先取对应节点的数值,代码如下:

前序:


    res[(*resSize)++] = root->val;//根
    preorder(root->left, res, resSize);//左
    preorder(root->right, res, resSize);/右

中序 

    preorder(root->left, res, resSize);//左
    res[(*resSize)++] = root->val;//根
    preorder(root->right, res, resSize);/右

后序

    preorder(root->left, res, resSize);//左
    preorder(root->right, res, resSize);/右
    res[(*resSize)++] = root->val;//根

单层递归的逻辑就是按照中左右的顺序来处理的,这样二叉树的前序遍历,基本就写完了 

代码

前序

void preorder(struct TreeNode* root, int* res, int* resSize) {
    if (root == NULL) {
        return;
    }
    res[(*resSize)++] = root->val;
    preorder(root->left, res, resSize);
    preorder(root->right, res, resSize);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    int* res = malloc(sizeof(int) * 2000);
    *returnSize = 0;
    preorder(root, res, returnSize);
    return res;
}

中序

void preorder(struct TreeNode* root, int* res, int* resSize) {
    if (root == NULL) {
        return;
    }
    preorder(root->left, res, resSize);
    res[(*resSize)++] = root->val;
    preorder(root->right, res, resSize);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    int* res = malloc(sizeof(int) * 2000);
    *returnSize = 0;
    preorder(root, res, returnSize);
    return res;
}

后序

void preorder(struct TreeNode* root, int* res, int* resSize) {
    if (root == NULL) {
        return;
    }
    preorder(root->left, res, resSize);
    preorder(root->right, res, resSize);
    res[(*resSize)++] = root->val;
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    int* res = malloc(sizeof(int) * 2000);
    *returnSize = 0;
    preorder(root, res, returnSize);
    return res;
}

你可能感兴趣的:(LeetCode刷题笔记,leetcode,算法,职场和发展)