Offer 驾到,掘友接招!我正在参与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
二、思路分析
1. 递归
特点:无需展开理解,不在乎实现过程,利用递归函数的语意信息去进行程序设计。
前序遍历按照根-左子树-右子树的方式遍历这个树。
- 递归函数
preorder,目的就是遍历root为根节点的二叉树 - 考虑边界条件,root为空时无需遍历
- 以根-左-右的方式,遍历左子树和右子树。
2. 迭代
迭代实现与递归是等价的,递归的时候隐式地维护了一个栈,而我们在迭代的时候需要显式地将这个栈模拟出来
- 定义一个
stack模拟栈 - 栈的特点 先进后出
- 初始root进栈,如果root不为空,先处理左子树,如果没有左孩子了,那么root为空,取栈顶元素,然后处理右孩子;
三、JavaScript代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
// 递归
function preorder(root, ans){
if(root == null) return;
ans.push(root.val);
preorder(root.left, ans);
preorder(root.right, ans)
}
var preorderTraversal = function(root) {
let ans = [];
preorder(root,ans);
return ans
};
// 迭代
var preorderTraversal = function(root) {
let res = [],
stack = [];
while (stack.length || root) {
while (root) {
res.push(root.val);
stack.push(root);
root = root.left;
}
// 栈的特点-取栈顶元素,
root = stack.pop();
root = root.right;
}
return res;
};