LeetCode 树的前、中、后序遍历
1. 树的各种遍历方法可以说是基本要求了,用递归方式去做,套一个模板就可以,我们主要考虑如何使用迭代法去做,递归代码直接给出:
var preorderTraversal = function(root) { let ans = []; function preorder(root) { if (!root) { return []; } ans.push(root.val); preorder(root.left); preorder(root.right); } preorder(root); return ans; };
var postorderTraversal = function(root) { let ans = []; function postorder(root) { if (!root) { return []; } postorder(root.left); postorder(root.right); ans.push(root.val); } postorder(root); return ans; };
var inorderTraversal = function(root) { let arr = []; function inorder(root) { if (!root) { return []; } inorder(root.left); arr.push(root.val); inorder(root.right); } inorder(root); return arr; };
2. 迭代算法:
【1】前序遍历:利用栈数据结构,先将节点遍历至最左节点,此过程中节点和值依次入栈(stack、vals),直到遇到节点为空,然后将栈顶元素出栈,寻找其右节点,再次循环此过程......
var preorderTraversal = function(root) { let stack = []; let vals = []; let cur = root; while (stack.length || cur) { while (cur) { stack.push(cur); vals.push(cur.val); cur = cur.left; } cur = stack.pop().right; } return vals; };
【2】中序遍历:类似前序遍历,但有微小变化。
var inorderTraversal = function(root) { let arr = []; let stack = []; let cur = root; while (stack.length || cur) { while (cur) { stack.push(cur); cur = cur.left; } cur = stack.pop(); arr.push(cur.val); cur = cur.right; } return arr; };
【3】后序遍历:我们知道前序遍历的顺序是 根结点 -> 左节点 -> 右节点,后序遍历的顺序是 左节点 -> 右节点 -> 根结点。
因此我们对前序遍历做修改,遍历到最左节点,改为最右节点,这样顺序就变成了 根结点 -> 右节点 -> 左节点,再对结果数组进行 reverse(),则顺序变成了 左节点 -> 右节点 -> 根结点。
var postorderTraversal = function(root) { let stack = []; let ans = []; let cur = root; while (stack.length || cur) { while (cur) { stack.push(cur); ans.push(cur.val); cur = cur.right; } cur = stack.pop().left; } return ans.reverse(); };

浙公网安备 33010602011771号