2025/12/27 7:29:07
网站建设
项目流程
网站打不开dns修改吗,易企秀h5制作免费,网站建设公司咋样,关于网站排名优化需要怎么做#xff08;递归遍历和层序遍历比较简单#xff0c;这里就不写了#xff09;
非递归遍历#xff08;逻辑的统一与非统一#xff09;
逻辑非统一遍历
前序#xff1a;先右后左入栈
中序#xff1a;一路向左 回溯
后序#xff1a;最难#xff0c;需要控制访问顺序…递归遍历和层序遍历比较简单这里就不写了非递归遍历逻辑的统一与非统一逻辑非统一遍历前序先右后左入栈中序一路向左 回溯后序最难需要控制访问顺序当然如果用前序的逻辑最后把结果集反转要简单很多逻辑统一遍历我们发现上面的三种遍历逻辑都不太一样能不能把逻辑统一一下只背一个模板呢这就需要我们模拟递归的函数栈栈里放TreeNode在当前节点入栈后同时入栈一个 null 当作标记第一次遇到节点先不输出先安排好它将来的输出时机null标记当从栈里弹出null时说明下一个弹出的节点就是“该输出”的节点入栈顺序和遍历顺序反着来即可前序是根左右那入栈顺序就是右左根以此类推习题思考LeetCode 226.翻转二叉树这一题比较简单先反转再递归还是先递归再反转都行先反转的逻辑比较直观清晰。LeetCode 101.对称二叉树注意该题递归时左节点和右节点比较完毕以后应该再比较的是左节点左子树右节点右子树左节点右子树右节点左子树注意对称比较即可。LeetCode 104.二叉树最大深度 / 111.二叉树最小深度最大深度递归遇到null就返回0否则沿着左右子树继续往下走取二者的max再加一返回值即可比较简单也比较好理解。代码如下public int maxDepth(TreeNode root) { if(root null) return 0; int leftDepth maxDepth(root.left); int rightDepth maxDepth(root.right); return Math.max(leftDepth,rightDepth) 1; }最小深度最初可能会以为把Math.max改成Math.min不就行了还真不行这两题的隐含条件其实是不一样的关键点在于左右子树即使有一边是null的也不影响“最大”这个概念但是“最小”就不一样了。最小深度隐含要求路径必须走到叶子节点而 null 不是一条合法的路径不能把null作为一个路径计数然后return 0进行高度比较因为你可能还没走到叶子节点。随便举一个例子只含2个节点的树如果按最大深度的逻辑写最小深度答案会是1因为空子树高度是0。但正确答案应该是2因为你应该比较叶子到根的路径一句话总结差异最大深度null 是高度为 0 的节点最小深度null 是不可通行的方向这里也把最小深度代码贴出来可以对比差异public int minDepth(TreeNode root) { if(root null) return 0; if(root.left null root.right null) return 1; if(root.left null) return minDepth(root.right) 1; if(root.right null) return minDepth(root.left) 1; return Math.min(minDepth(root.left),minDepth(root.right)) 1; }