Skip to content

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

Description

@chencl1986

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

解题思路:

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

后序遍历

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

  1. 从图片中,可以看到输出节点的顺序是从下到上,从左到右。
  2. 我们可以使用栈来进行遍历,每次循环入栈元素都为从上到下,从左到右。
  3. 那么每次循环时出栈元素的顺序都为从上到下,从右到左。
  4. 但此时的栈的元素输出顺序与需要的结果顺序正好相反。
  5. 解决方案就是将输出的结果插入到结果数组的头部,这样最终输出结果顺序就为从下到上,从左到右。
/** * @param {TreeNode} root * @return {number[]} */varpostorderTraversal=function(root){letresult=[];// 保存结果。letstack=[];// 使用栈进行遍历和输出结果。root&&stack.push(root);// 链表有值时才开始遍历。// 不断遍历直到清空栈while(stack.length){// 每次从栈中弹出一个节点,由于入栈顺序是从上到下,从左到右。// 出栈顺序就会变成从上到下,从右到左。constnode=stack.pop();// 由于最终输出的结果是从下到上,从左到右。// 每次将弹出的节点插入到数组前端,即保证了最终输出的结果顺序。result.unshift(node.val);// 将子节点按照从左到右的顺序入栈,保证了输出顺序为从右到左。node.left&&stack.push(node.left);node.right&&stack.push(node.right);}returnresult;};

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions