这是我参与2022首次更文挑战的第39天,活动详情查看:2022首次更文挑战
题目描述
提供一个二叉树,需要你返回它的前序遍历。
通过画图举个例子:
前序遍历返回结果: 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
};
第二种方法
除了第一种方法的递归遍历,我们还可以使用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
};