写点什么

LeetCode 题解:145. 二叉树的后序遍历,栈,JavaScript,详细注释

用户头像
Lee Chen
关注
发布于: 2021 年 04 月 20 日
LeetCode题解:145. 二叉树的后序遍历,栈,JavaScript,详细注释

原题链接:145. 二叉树的后序遍历


解题思路:


对于该题,我们可以首先看后续遍历对应的示意图,图片来自官方题解



后续遍历最后的输出顺序,就是按照图中的1-2-3-4-5。我们需要做的,其实是如何使用一个栈来实现这个过程。


  1. 从图片中,可以看到输出节点的顺序是从下到上,从左到右。

  2. 我们可以使用栈来进行遍历,每次循环入栈元素都为从上到下,从左到右。

  3. 那么每次循环时出栈元素的顺序都为从上到下,从右到左。

  4. 但此时的栈的元素输出顺序与需要的结果顺序正好相反。

  5. 解决方案就是将输出的结果插入到结果数组的头部,这样最终输出结果顺序就为从下到上,从左到右。


/** * @param {TreeNode} root * @return {number[]} */var postorderTraversal = function (root) {  let result = []; // 保存结果。  let stack = []; // 使用栈进行遍历和输出结果。  root && stack.push(root); // 链表有值时才开始遍历。
// 不断遍历直到清空栈 while (stack.length) { // 每次从栈中弹出一个节点,由于入栈顺序是从上到下,从左到右。 // 出栈顺序就会变成从上到下,从右到左。 const node = stack.pop();
// 由于最终输出的结果是从下到上,从左到右。 // 每次将弹出的节点插入到数组前端,即保证了最终输出的结果顺序。 result.unshift(node.val);
// 将子节点按照从左到右的顺序入栈,保证了输出顺序为从右到左。 node.left && stack.push(node.left); node.right && stack.push(node.right); }
return result;};
复制代码


发布于: 2021 年 04 月 20 日阅读数: 6
用户头像

Lee Chen

关注

还未添加个人签名 2018.08.29 加入

还未添加个人简介

评论

发布
暂无评论
LeetCode题解:145. 二叉树的后序遍历,栈,JavaScript,详细注释