题目
给你一棵二叉树的根节点 root
,返回其节点值的 后序遍历 。
输入: root = [1,null,2,3] 输出: [3,2,1]
思路一
我们这里使用双重循环的方式进行实现,首先声明两个空数组,分别为res何stack,res数组是存储最后返回结果的数组,然后我们使用while循环,循环条件为只要root参数不等于null或者stack.length大于0任何一个条件满足都会继续循环,在循环中我们二层循环也是使用的while,二层循环的条件为当前的root参数不为null就会进行循环,在循环汇总我们使用push方式将root参数添加到stack数组中,在使用unshift方法将root的val属性添加到res数组中,在将root参数的右节点赋值给root参数,最后循环的root参数右节点为null之后我们使用pop方法将stack数组中的末尾数截取下来,在将末尾数的左节点赋值给root参数,以此往复,最后在将res数组返回出去
/** * @param {TreeNode} root * @return {number[]} */ var postorderTraversal = function(root) { let res = [],stack = []; while(root!=null || stack.length>0) { while(root!=null) { stack.push(root) res.unshift(root.val) root = root.right } root =stack.pop().left } return res };
思路二
我们这里使用递归进行实现,我们先声明一个空数组stack,然后在声明一个递归函数des,递归函数需要终止条件,我们设置的终止条件是root参数如果为null的情况下则进行终止,后序遍历需要遵循的顺序为先左在右后根,我们根据这个顺序使用des递归函数去递归root参数的左节点和右节点,最后我们使用push方法将root的val参数添加到stack中,我们在进行调用des递归函数,参数为root,最后等递归函数执行完毕后将stack返回出去即可
/** * @param {TreeNode} root * @return {number[]} */ var postorderTraversal = function(root) { let stack = []; function des(root){ if(root==null){return} des(root.left); des(root.right); stack.push(root.val); } des(root); return stack; };