开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
题目
给你一棵二叉树的根节点 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;
};