二叉树的后序遍历。后序遍历我记为左 - 右 - 根。
依然用GeeksforGeeks的例子来描述如何做后序遍历吧。
Postorder (Left, Right, Root) : 4 5 2 3 1
依然是迭代和递归两种做法,两种做法的时间空间复杂度也都是O(n)。
递归没什么好讲的,直接上代码。
1 /** 2 * @param {TreeNode} root 3 * @return {number[]} 4 */ 5 var postorderTraversal = function(root) { 6 let res = []; 7 if (root === null) return res; 8 helper(res, root); 9 return res; 10 }; 11 12 var helper = function(res, root) { 13 if (root === null) return; 14 helper(res, root.left); 15 helper(res, root.right); 16 res.push(root.val); 17 };
迭代
需要注意的是当把当前节点cur加入到结果集的时候,要加在结果集的最前面而不是最后。
1 /** 2 * @param {TreeNode} root 3 * @return {number[]} 4 */ 5 var postorderTraversal = function(root) { 6 let res = []; 7 if (root === null) return res; 8 let stack = []; 9 stack.push(root); 10 while (stack.length) { 11 let cur = stack.pop(); 12 res.unshift(cur.val); 13 if (cur.left) stack.push(cur.left); 14 if (cur.right) stack.push(cur.right); 15 } 16 return res; 17 };