[路飞]_leetcode-145-二叉树的后序遍历

简介: leetcode-145-二叉树的后序遍历

网络异常,图片无法展示
|


「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战


[题目地址][B站地址]


给定一个二叉树,返回它的 后序 遍历。


示例:


输入: [1,null,2,3]  
   1
    \
     2
    /
   3 
输出: [3,2,1]
复制代码


进阶: 递归算法很简单,你可以通过迭代算法完成吗?


题解1


首先我们用本题所说的很简单的方法,递归完成本题


解题思路如下:


  1. 当根结点为空的时候,递归终止
  2. 递归的处理左子树、右子树,最后将当前结点的值 push 到结果数组


代码如下:


var postorderTraversal = function(root) {
  const res = [];
  function postorder(root){
    if(root === null) return;
    postorder(root.left);
    postorder(root.right);
    res.push(root.val);
  }
  postorder(root);
  return res;
};
复制代码


题解2


那怎么通过迭代算法完成二叉树的后序遍历呢?


解题思路如下:


  1. 首先初始化一个栈和一个结果数组
  2. 当存在右子树的时候,一直向下找右子树,该过程中将每个结点压入栈中,并将它的值倒序的插入结果数组
  3. 当找到最右边的右子树之后,将压入栈的元素取出,并将root指向它的左子树
  4. 此时如果左子树存在,则左子树的值会被插入到结果数组的头部
  5. 如此一个一个的三元组处理完成,直到根结点,则会进入左子树处理
  6. 这个过程,结点值插入的顺序是 根 右 左
  7. 因为节点的值每次是插入结果数组头部的,所以结果数组值的顺序为左 右 根
  8. 最后返回结果数组即可


代码如下:


var postorderTraversal = function(root) {
  // 初始化栈和结果数组
  const stack =[],
  res = [];
  while (root || stack.length){
    // 一直向下找右子树
    while(root){
      // 将每个节点压入栈中
      stack.push(root);
      // 过程中将每个结点的值倒序的插入结果数组
      res.unshift(root.val);
      root = root.right;
    }
    // 将压入栈的元素取出,并将root指向它的左子树
    // 此时如果左子树存在,则左子树的值会被插入到结果数组的头部
    root = stack.pop().left;
  }
  // 如此一个一个的三元组处理完成,直到根结点,则会进入左子树处理
  // 这个过程,结点值插入的顺序是 根 右 左
  // 因为节点的值每次是插入结果数组头部的,所以结果数组值的顺序为左 右 根
  return res;
};
复制代码


至此我们就完成了 leetcode-145-二叉树的后序遍历


如有任何问题或建议,欢迎留言讨论!

相关文章
|
2月前
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度
26 2
|
2月前
【LeetCode 29】226.反转二叉树
【LeetCode 29】226.反转二叉树
20 2
|
2月前
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
21 0
|
2月前
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
15 0
|
2月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
23 0
|
2月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
22 0
|
2月前
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度
19 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
63 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
128 2