LeetCode 「简单」144.二叉树的前序遍历
题目描述
给定一个二叉树的根节点 root ,返回 它的 前序 遍历 。
示例
输入:root = [1,null,2,3]
输出:[1,2,3]
输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]
输出:[1,2,4,5,6,7,3,8,9]
输入:root = []
输出:[]
输入:root = [1]
输出:[1]
解答
递归
Code
/**
* 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[]}
*/
var preorderTraversal = function(root) {
if (!root) return [];
const result = [];
const dfs = (node) => {
if (!node) return;
result.push(node.val);
dfs(node.left);
dfs(node.right);
};
dfs(root);
return result;
};
迭代
思路
- 使用栈
- 使用一个栈来模拟递归调用的过程
- 栈用于存储尚未处理的节点
- 初始化
- 将根节点压入栈中
- 遍历逻辑
- 当栈不为空时,执行以下操作:
- 弹出栈顶节点,访问该节点(将其值添加到结果数组中)
- 将右子节点压入栈(如果存在)
- 将左子节点压入栈(如果存在)
- 由于栈是后进先出(LIFO)结构,先压入右子节点,再压入左子节点,这样在弹出时左子节点会先被处理
- 结果数组
- 通过上述逻辑,结果数组将按照前序遍历的顺序存储所有节点的值
Code
/**
* 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[]}
*/
var preorderTraversal = function(root) {
if (!root) return [];
const result = []; // 用于存储遍历结果
const stack = [root]; // 初始化栈,将根节点压入栈
while (stack.length) {
const node = stack.pop(); // 弹出栈顶节点
result.push(node.val); // 访问当前节点
// 先压入右子节点,再压入左子节点
if (node.right) stack.push(node.right);
if (node.left) stack.push(node.left);
}
return result;
};
