力扣日记11.2-【二叉树篇】二叉树的递归遍历

力扣日记:【二叉树篇】二叉树的递归遍历

日期:2023.11.2
参考:代码随想录、力扣

144. 二叉树的前序遍历

题目描述

难度:简单

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

进阶:递归算法很简单,你可以通过迭代算法完成吗?

题解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root, result);
        return result;
    }
    void traversal(TreeNode* cur, vector<int>& vec) {
        // 前序遍历:中左右
        if (cur == NULL) return;
        vec.push_back(cur->val);
        traversal(cur->left, vec);
        traversal(cur->right, vec);
    }
};
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
/*
// 普通写法
func preorderTraversal(root *TreeNode) (res []int) {
    traversal(root, &res) // 传递res切片的地址
    return 
}
func traversal(cur * TreeNode, r *[]int) { // 函数参数是值传递,想要引用传递需传递地址即加&
    if cur == nil {
        return
    }
    *r = append(*r, cur.Val) // *r访问实际切片
    traversal(cur.Left, r)
    traversal(cur.Right, r)
}
*/
// 采用函数变量实现递归
func preorderTraversal(root *TreeNode) (res []int) {
    // 函数变量
    var traversal func(cur *TreeNode)
    traversal = func(cur *TreeNode) { // 定义递归函数变量(实现递归函数)
        if cur == nil {
            return
        }
        res = append(res, cur.Val)  // 这样可以使res为preorderTraversal所定义的返回值变量
        traversal(cur.Left)
        traversal(cur.Right)
    }

    // 调用递归函数
    traversal(root)
    return
}

复杂度

时间复杂度:
空间复杂度:

94. 二叉树的中序遍历

题目描述

难度:简单

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

题解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        traversal(root, res);
        return res;
    }
    void traversal(TreeNode* cur, vector<int>& res) {
        // 中序遍历:左中右
        if (cur == NULL) return;
        traversal(cur->left, res);
        res.push_back(cur->val);
        traversal(cur->right, res);
    }
};

复杂度

时间复杂度:
空间复杂度:

145. 二叉树的后序遍历

题目描述

难度:简单

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。

题解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root, result);
        return result;
    }
    void traversal(TreeNode* cur, vector<int>& vec) {
        // 后序遍历:左右中
        if (cur == NULL) return;
        traversal(cur->left, vec);
        traversal(cur->right, vec);
        vec.push_back(cur->val);
    }
};

复杂度

时间复杂度:
空间复杂度:

思路总结

  • 二叉树理论基础
  • 前中后序遍历看得是中间节点的遍历顺序,即:
    • 前序遍历:中左右
    • 中序遍历:左中右
    • 后序遍历:左右中
  • 递归的三要素(By 代码随想录):
    • 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
    • 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
    • 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

你可能感兴趣的:(leetcode,算法,职场和发展)