Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目分析
给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。
思路讲解
后序遍历方式为:左右中
后续遍历我们可以不断的访问树的左节点
- 找出当前节点最左边的节点然后输出
- 在去找当前节点的父节点的右节点直到找到最右边的节点然后输出
- 最后输出父节点 直到将整个树遍历完成。
遍历树有两种方法:
递归法:调用方法不断地访问当前节点的左节点直到左节点没有左子节点,再调用递归方法去访问当前节点的右节点,直到没有右子节点,最后在输出当前节点迭代法:迭代的方法就是进行反向的进行后续遍历——中右左, 然后将遍历的值加入到栈中,在通过栈来输出加入到数组中,栈是先进后出的,所有加入到数组的值是前后中,就为前序遍历了
示例
输入: root = [1,null,2,3]
输出: [3,2,1]
输入: root = []
输出: []
输入: root = [1]
输出: [1]
代码
/*
* @lc app=leetcode.cn id=145 lang=javascript
*
* [145] 二叉树的后序遍历
*/
// @lc code=start
/**
* 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) {
// 递归写法
// let res = new Array()
// return postorderTraversalNode(root, res)
// 迭代写法:模拟树 后序遍历:左右中,栈:先进后出,利用栈的特性,逆序的添加进栈
// 先把中压入栈,然后把右压入栈,然后把左压入栈,输出的时候先输出左,在输出右,最后输出中
// 前后中:
// 前
// 后
// 中
let res = []
if (!root) return res
let stack = [root]
while (stack.length) {
root = stack.pop()
res.unshift(root.val)
if (root.left) stack.push(root.left)
if (root.right) stack.push(root.right)
}
return res
};
// 递归写法
var postorderTraversalNode = function (node, res) {
if (node) {
postorderTraversalNode(node.left, res)
postorderTraversalNode(node.right, res)
res.push(node.val)
}
return res
}
// @lc code=end