力扣:二叉树的前序遍历

二叉树的前序遍历

一、题目

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

示例 1:

img

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

示例 2:

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

示例 3:

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

示例 4:

img

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

示例 5:

img

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

提示:

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

**进阶:**递归算法很简单,你可以通过迭代算法完成吗?

二、思路和原理

1.递归法逻辑

实现递归的三要素:

  1. 确实递归函数的参数和返回值
  2. 确定终止条件
  3. 确定单层逻辑

由于这道题的递归需要传入两个参数,既当前的根节点和最后的返回值,题目本身的函数只传入了一个参数,所以不符合递归的实现条件,此时我们可以自己单独再建一个函数用于实现递归。

  1. 本题中传入的参数和返回值:

    1
    Traversal(root,res)
  2. 终止条件:

    1
    2
    //当前的根节点为空
    if(root==null){return;}
  3. 单层逻辑

    1
    2
    3
    4
    5
    //对于一个最简单的只要两层的二叉树的逻辑
    //先取出并保存根节点的值,然后获取其左子树的值并保存,然后是右子树....以此内推
    val.push(res);
    Traversal(res.left,val);//处理左子树
    Traversal(res.right,val);//处理右子树

2.迭代法逻辑

迭代主要要用到栈先入后出的特性:

前序遍历的顺序是:根–>左–>右

那么前序遍历入栈的顺序就是:根节点入栈–>弹栈–>右子树入栈–>左子树入栈–>左子树弹栈–>右子树弹栈

三、解题

1.递归法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 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 Traversal=function(root,val){
if(root==null){return;}
val.push(root.val);
Traversal(root.left,val);
Traversal(root.right,val);
}
var preorderTraversal = function(root) {
let res=[];
Traversal(root,res);
return res;
};

2.迭代法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* 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) {
let stack=[root];//栈 将根节点存入栈中
let res=[];
if(root==null){return res;}
while(stack.length){
// console.log("-----",stack);
let node=stack.pop();
// console.log(node.val)
res.push(node.val);
node.right&&stack.push(node.right);
node.left&&stack.push(node.left);
}
return res;
};

力扣:二叉树的前序遍历
https://chen77.top/2024/01/03/leetcode/144二叉树的前序遍历/
作者
小陈
发布于
2024年1月3日
许可协议