这是我参与2022首次更文挑战的第40天,活动详情查看:2022首次更文挑战
题目描述
给你一个二叉树,需要你返回这个二叉树的后序遍历的节点的val,以数组的形式返回。
再画个图来解释下,哈哈哈
这个二叉树的后序遍历返回的节点是:
4 -> 5 -> 2 -> 8 > 6 -> 9 -> 7 -> 3 -> 1
思路分析
中序遍历:遍历从最左边树开始,然后到节点,然后到右边树,一直重复这个流程,直至遍历到最右边的右边树。
前序遍历:遍历从根节点开始,然后到子节点,然后到子节点的左边树,然后到右边树,一直重复这个流程,直至遍历到最右边的右边树。
后序遍历: 遍历从最左边树开始,然后到右边树,最后才到左边树,一直重复这个流程,直至遍历到根节点。
第一种方法(递归)
这个是使用递归方法,定义一个res数组,存储后序遍历的节点的值。
先遍历节点的左边树,递归遍历,把val push到数组res中
接着递归遍历节点的右边树,把val push到数组res中
最后才把当前的节点的val push到数组res中。
这样子遍历结束后,res存储的就是后序遍历的节点val。
返回res即可。
代码如下:
/**
* 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) {
const res = []
function postorder (root) {
if(!root) return
postorder(root.left)
postorder(root.right)
res.push(root.val)
}
postorder(root)
return res
};
第二种方法(迭代)
迭代法是通过while循环实现的。
定义一个res数组,返回后序遍历的节点的val,一个stack数组,代表入栈的节点。
首先是从节点遍历,然后把它的val unshift到数组的开头。
把它push到stack中,入栈。
然后接着遍历节点的右边树,并且把它们的val unshift到数组的开头。
当右边树为null的时候,然后把节点从stack中出栈,继续遍历它左边树,把左边树的val unshift到数组的开头。
继续遍历,重复上面的步骤。
当stack为空的时候,并且当前没有节点的时候,代表已经遍历完成。
这时候数组的顺序就是左边树 -> 右边树 -> 节点,也就是后序遍历的顺序。
返回res数组即可。
代码如下:
/**
* 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) {
const res = []
const stack = []
while (root || stack.length) {
while (root) {
stack.push(root)
res.unshift(root.val)
root = root.right
}
root = stack.pop()
root = root.left
}
return res
};