leetcode每天一题:【二叉树的前序遍历】(简单)

169 阅读2分钟

这是我参与2022首次更文挑战的第39天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

提供一个二叉树,需要你返回它的前序遍历。

通过画图举个例子:

image.png

前序遍历返回结果: 1 -> 2 -> 4 -> 5 -> 3 -> 6 -> 8 -> 7 -> 9

思路分析

我们之前学过二叉树的中序遍历,文章的链接在这里

这里我再简单总结一下。

中序遍历:从根节点的左边树开始,遍历后再遍历根节点,遍历完根节点再遍历根节点的右边树。下面的子节点也都是这样的逻辑。

前序遍历:从根节点开始遍历,遍历后再遍历根节点的左边树,遍历完左边树再遍历根节点的右边树。下面的子节点也都是这样的逻辑。

第一种方法

我们可以定义一个数组res,当作返回的结果。

然后定义个函数preorder,递归调用。

接受节点为参数。

如果没有节点则返回。

有节点就把当前节点的val push到数组中。

然后继续递归遍历当前节点的左边树,

然后是右边树。

最后把数组res返回。 它里面就是前序遍历的节点。

代码如下:

/**
 * 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) {
  const res = []
  function preorder (root) {
    if (!root) return
    res.push(root.val)
    preorder(root.left)
    preorder(root.right)
  }
  preorder(root)
  return res
};

image.png

第二种方法

除了第一种方法的递归遍历,我们还可以使用while循环遍历。

定义一个res数组,代表返回的前序的节点val。

还有一个stack数组,代表着入栈的节点。

进行while循环,只要有节点或者stack数组有值,就一直循环。

内部还有个while循环,只要有节点,就把当前节点,push到stack数组中。

然后把节点的val push到res数组中。

继续遍历节点的左边树,把左边树赋值给当前节点,继续while循环。

如果当前节点为null了,则截取stack数组的最后一个节点,出栈,把它的右边树赋值给当前节点,继续while循环。

当当前节点和stack都为空时,代表遍历已经结束。

最后得到的res数组就是前序遍历的节点。

代码如下:

/**
 * 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) {
  const res = []
  const stack = []
  while (root || stack.length) {
    while (root) {
     stack.push(root)
     res.push(root.val)
     root = root.left
    }
    root = stack.pop()
    root = root.right
  }
  return res
};

image.png