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)

浙公网安备 33010602011771号