145.二叉树的后序遍历

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

示例:

输入: [1,null,2,3]  

   1
    \
     2
    /
   3 

输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

思路:后序遍历:左节点-右节点-根结点
方法一:递归
 1 /**
 2  * Definition for a binary tree node.
 3  * function TreeNode(val, left, right) {
 4  *     this.val = (val===undefined ? 0 : val)
 5  *     this.left = (left===undefined ? null : left)
 6  *     this.right = (right===undefined ? null : right)
 7  * }
 8  */
 9 /**
10  * @param {TreeNode} root
11  * @return {number[]}
12  */
13 var postorderTraversal = function(root) {
14         let res = [];
15     if(root){
16     res = res.concat( postorderTraversal(root.left));
17     res = res.concat( postorderTraversal(root.right));
18     res.push(root.val);
19       
20 }
21 return res;
22 };

 复杂度分析

  • 时间复杂度:O(n),其中 n是二叉搜索树的节点数。每一个节点恰好被遍历一次
  • 空间复杂度:O(n),为递归过程中栈的开销,平均情况下为O(logn),最坏情况下树呈现链状,为O(n)
方法二:迭代
 1 /**
 2  * Definition for a binary tree node.
 3  * function TreeNode(val, left, right) {
 4  *     this.val = (val===undefined ? 0 : val)
 5  *     this.left = (left===undefined ? null : left)
 6  *     this.right = (right===undefined ? null : right)
 7  * }
 8  */
 9 /**
10  * @param {TreeNode} root
11  * @return {number[]}
12  */
13 var postorderTraversal = function(root) {
14  const res =[];
15  const stack = [];
16  while(root||stack.length){
17      while(root){
18          stack.push(root);
19          res.unshift(root.val);
20          root = root.right;
21      }
22      root = stack.pop();
23      root = root.left;
24  }
25  return res;
26 };

 复杂度分析

  • 时间复杂度:O(n),其中 n是二叉搜索树的节点数。每一个节点恰好被遍历一次
  • 空间复杂度:O(n),为递归过程中栈的开销,平均情况下为O(logn),最坏情况下树呈现链状,为O(n)
posted @ 2021-08-26 13:42  icyyyy  阅读(228)  评论(0)    收藏  举报