【LeetCode】144. 二叉树的前序遍历

139 阅读1分钟

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。

题目

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

示例 1

img

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2

输入:root = []
输出:[]

示例 3

输入:root = [1]
输出:[1]

示例 4

img

输入:root = [1,2]
输出:[1,2]

示例 5

img

输入:root = [1,null,2]
输出:[1,2]

提示

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

我的题解

思路

这题是最经典的二叉树的遍历-先序遍历

二叉树的深度优先遍历有先序遍历、中序遍历、后序遍历等

不管哪种遍历方式,都是从左往右的,所谓的先、中、后的区别是指遍历根节点的顺序:

  1. 先序遍历是指先遍历根节点、再遍历左子树,最后遍历右子树,即根、左、右
  2. 中序遍历是指先遍历左子树、再遍历根节点、最后遍历右子树,即左、根、右
  3. 后序遍历是指先遍历左子树、再遍历右子树、最后遍历根节点,即左、右、根

不论是哪种方式,一定是先左后右,改变的只有根节点的顺序

二叉树的定义:二叉树要么是一棵空树,要么是由一棵非空的根节点与左、右子树构成的树,其左、右子树也是二叉树

由定义可知,二叉树是一种天然的递归结构,自然也很适合用递归来实现

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<Integer> ans = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
        preorder(root);
        return ans;
    }
    void preorder(TreeNode root){
        //递归终止条件,遍历到空节点(叶节点的子节点)
        if(root == null){
            return;
        }
        //先访问根节点
        ans.add(root.val);
        //递归访问左子树
        preorder(root.left);
        //递归访问左子树
        preorder(root.right);
    }
}

递归的几个核心步骤:

  1. 递归终止条件: 标志递归的结束,防止无限递归调用,导致栈溢出。而递归的终止,往往也是问题分解到最小的时候
  2. 当前步骤的处理:相当于迭代步骤中的循环执行的代码
  3. 递归调用:将当前的问题分解成更小的部分来解决

结语

业精于勤,荒于嬉;行成于思,毁于随。