
题目
给你一棵二叉树的根节点
root
,返回其节点值的 后序遍历 。
示例 1:
输入:root = [1,null,2,3]
输出:[3,2,1]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
提示:
树中节点的数目在范围 [0, 100] 内
-100 <= Node.val <= 100
思路
- 递归写法
- 函数参数是当前二叉树节点和一个用于存放结果的数组
- 终止条件是节点为空
- 二叉树后序遍历的顺序是“左右中”,因此单层递归逻辑就是先递归左节点,再递归右节点,最后将中间节点的值存放进结果数组。
- 迭代写法
- 迭代写法可以先看看先序遍历的迭代写法【leetcode】144.二叉树的前序遍历,先序遍历的顺序是“中左右”,后续遍历的顺序是“左右中”,交换先序遍历中左节点和右节点的遍历顺序,变成"中右左",然后再反转结果数组即得到“左右中”。
- 代码只需要在前序遍历的基础上稍微更改。
代码
- 递归
/**
* 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 postorderTraversal = function(root) {
function traversal(node , ans){
if(!node) return
// 递归左节点
traversal(node.left , ans)
// 递归右节点
traversal(node.right , ans)
// 将中间节点的值存放进结果数组
ans.push(node.val)
}
let ans = []
traversal(root , ans)
return ans
};
- 迭代
/**
* 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 postorderTraversal = function(root) {
if(!root) return []
let stack = []
let ans = []
queue.push(root)
while(stack.length){
const node = stack.pop()
// 中间节点值加入结果数组
ans.push(node.val)
// 左节点先入栈
if(node.left) stack.push(node.left)
// 右节点后入栈
if(node.right) stack.push(node.right)
}
// 结果数组翻转后返回
return ans.reverse()
};
关注我的专栏,每天更新三道leetcode题解,一起变强!