「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。
题目
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例 1
输入:root = [1,null,2,3]
输出:[1,2,3]
示例 2
输入:root = []
输出:[]
示例 3
输入:root = [1]
输出:[1]
示例 4
输入:root = [1,2]
输出:[1,2]
示例 5
输入:root = [1,null,2]
输出:[1,2]
提示
- 树中节点数目在范围 [0, 100] 内
- -100 <= Node.val <= 100
我的题解
思路
这题是最经典的二叉树的遍历-先序遍历
二叉树的深度优先遍历有先序遍历、中序遍历、后序遍历等
不管哪种遍历方式,都是从左往右的,所谓的先、中、后的区别是指遍历根节点的顺序:
- 先序遍历是指先遍历根节点、再遍历左子树,最后遍历右子树,即根、左、右
- 中序遍历是指先遍历左子树、再遍历根节点、最后遍历右子树,即左、根、右
- 后序遍历是指先遍历左子树、再遍历右子树、最后遍历根节点,即左、右、根
不论是哪种方式,一定是先左后右,改变的只有根节点的顺序
二叉树的定义:二叉树要么是一棵空树,要么是由一棵非空的根节点与左、右子树构成的树,其左、右子树也是二叉树
由定义可知,二叉树是一种天然的递归结构,自然也很适合用递归来实现
代码
/**
* 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);
}
}
递归的几个核心步骤:
- 递归终止条件: 标志递归的结束,防止无限递归调用,导致栈溢出。而递归的终止,往往也是问题分解到最小的时候
- 当前步骤的处理:相当于迭代步骤中的循环执行的代码
- 递归调用:将当前的问题分解成更小的部分来解决
结语
业精于勤,荒于嬉;行成于思,毁于随。