leecode94—二叉树中序遍历
-
思路
- 递归(左,中,右)
/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @return {number[]} */ var inorderTraversal = function(root) { let result = [] inorderF(result,root) return result }; /** * @param {TreeNode} root * @param {number[]} result * @return {number[]} */ function inorderF(result,root) { //判断空结点 if (root === null){return} //left inorderF(result,root.left) //root result.push(root.val) //right inorderF(result,root.right) }
-
解析:先理解中序遍历:左子树-根节点-右子树;针对最小子树这种情况单独分析:再借助递归思想,其实我们可以发现递归到最后都会只剩一个节点,然后返回上一个节点的位置,因此我们只需要
- 一开始我们是处在1节点,但按照中序遍历我们其实是需要先从左边开始,也就是我们需要切换成2节点位置(因为我们可以发现递归这种形式,遍历到最后都会只剩一个节点,然后当前函数执行完毕是会返回到上一个节点的位置),处在2位置,我们看成一个更小的子树,左为空不作为,根节点有效存值,右为空不作为,然后返回上一级函数,执行相同的操作,这就是中序遍历递归做法的核心
- 迭代:在递归基础上多加一个栈存放遍历节点的顺序,都是先遍历树到最左边直到不能遍历,在栈里提取上一次节点的位置,存储结果,接着换到该位置的右节点位置继续按照上述步骤遍历,当右节点也为空时但此时栈不为空(意为着还有节点的右子树还未遍历),就继续在栈里提取上一次节点的位置,存储结果,又换到该位置的右节点位置继续遍历,最终栈为空,(右)节点也为空就是遍历完成
//迭代解法 var inorderTraversal = function(root) { const res = []; const stk = []; while (root || stk.length) { while (root) { stk.push(root); root = root.left; } root = stk.pop(); res.push(root.val); root = root.right; } return res; };