题目
给你二叉树的根节点 root
,返回它节点值的前序遍历。
输入: root = [1,null,2,3] 输出: [1,2,3]
思路一
我们这里使用递归的方式进行实现,首先声明一个res空数组,用户于接收遍历后的结果值,我们在声明一个preOrder递归函数,这个函数接受二个参数,一个是root参数,一个是res空数组,用于接受结果值,在preOrder函数中,我们先判断一下当前的root参数是不是为空,如果为空则直接return出来,这个也是递归终止的条件,然后在将当前root.val参数通过push方法添加到res数组中,然后进行在将root的左节点和右节点分别使用preOrder函数进行调用,第二个参数都传res数组,最后在将res数组返回出去即可
var preorderTraversal = function (root) { const res = []; preOrder(root, res); return res; }; var preOrder = function (root, res) { if (!root) return; res.push(root.val); preOrder(root.left, res); preOrder(root.right, res); }
思路二
我们这里使用了栈的方法,我所认为的是所有可以通过递归解决的事情,也可以通过栈的方式进行解决,我们这里声明两个数组,分别为stack和res,这两个都是空数组,然后我们使用循环,循环条件为当前root参数不为null或者stack栈的长度大于0,在循环中在进行二次循环,循环条件为当前的root参数不为null,在二次循环中,我们将root的cal参数使用push方法添加到res数组中,同时也使用push方法将root参数添加到stack数组中,然后将root的左节点赋值给root参数,然后我们会不断的进入root参数的左节点,并通过循环的方式将经过的节点都存储起来,当我们遇到root参数等于null的时候循环会终止,终止之后我们使用pop方法将当前stack数组中的末尾节点并获取到该节点的右节点赋值给root参数,然后就会进入下一次循环,重复这个过程就可以找出前序遍历,最后将res数组返回出去
var preorderTraversal = function(root) { const stack = []; const res = []; while(root !== null || stack.length > 0){ while(root !== null){ res.push(root.val); stack.push(root); root = root.left; } root = stack.pop().right; } return res; };