「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」
前言
前面我们了解过二叉树的前序遍历-验证二叉树的前序序列化,今天我们实战二叉树的前序遍历,分别用简单的递归法以及进阶的迭代法求解。
题目描述
144. 二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例1:
输入: root = [1,null,2,3]
输出: [1,2,3]
解题思路
递归法思路:
我们需要一个数组来存放节点值,和一个给结果数组push值的转换方法transfer,在transfer函数里递归调用它本身即可
迭代法思路:
我们需要一个存取节点的栈,一个放节点值的数组,先把根节点入栈,然后进入循环取存栈节点给结果数组push值的过程,每次从栈中pop节点出来及每次使用栈顶元素,把节点值放入结果数组,用完之后把符合前序遍历顺序的节点入栈,然后继续下一层循环,直到栈中无节点可用
开始解题
递归法解题:
var preorderTraversal = function(root) {
let resArr = [];
travese(root,resArr); // 从根节点启动节点到节点值数组的转换函数
return resArr;
};
var travese = function(root,resArr) {
if(!root) return null;
// 可以从大的结构分步,先放根节点,再递归处理左-右子树
resArr.push(root.val);
travese(root.left, resArr);
travese(root.right, resArr);
}
迭代法解题:
var preorderTraversal = function(root) {
if(!root) return [];
let stack = [root]; // 栈中第一个要处理的就是根节点
let resArr = [];
while(stack.length) {
const current = stack.pop(); // 每次处理栈顶节点
resArr.push(current.val);
// 因为每次处理的栈顶节点,所以按照前序遍历根左右的顺序下次要处理左节点,
// 所以要先push右节点,再push左节点,这样左节点就在栈顶了
current.right && stack.push(current.right);
current.left && stack.push(current.left);
}
return resArr;
};