Leetcode104 二叉树最大深度 踩坑
Posted guo-xin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode104 二叉树最大深度 踩坑相关的知识,希望对你有一定的参考价值。
104题难度为简单,可本人却画了不少时间,现将遇到的坑写在此,方便日后复习。大家应该不会遇到这么蠢的问题。
1.递归方法很简单,也很巧妙这里就不说了。
2.下面主要是深度遍历方法中本人遇到的坑。
3.看到题目想到可以通过深度遍历来解决问题,借助栈把深度计算出来(坑就在这个栈里,这种题目还是先画个图看看,再撸代码吧,笑哭了)。
下面是本人的代码,思想:将每层元素存入栈中,然后再逐一弹出,并深度标志加1。大概想了一下应该问题不大,题目给的实列也通过了,可提交代码时问题来了
不能通过所有实例。并给出了没通过的树,如下:[1,2,3,4,null,null,5];
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 public int maxDepth(TreeNode root) { 12 if(root == null){ 13 return 0; 14 } 15 Stack<TreeNode> stack = new Stack<>(); 16 int num = 0; 17 stack.push(root); 18 while(!stack.isEmpty()){ 19 num++; 20 int size = stack.size(); 21 for(int i = 0;i < size;i++){ 22 TreeNode cur = stack.pop(); 23 if(cur.left != null) 24 stack.push(cur.left); 25 if(cur.right != null) 26 stack.push(cur.right); 27 } 28 } 29 return num; 30 } 31 }
此树的最大深度为3,而本人代码输出为4。画图后自己推一下,确实是4。因为栈总是先弹出后进的元素当,代码运行到元素3时,应该接着弹出2才对,可栈会弹出5,那么问题就来了,
当5弹出后此时深度标志就已经为3.当下次循环弹出元素2时,左子树还存在元素4。导致多一次循环,输出为4。
4.通过观察发现如果符合先进先出就可符合题意,当然想到了LinkedList。add添加元素,pollFirst弹出先进如元素。完美解决问题。代码如下:
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 public int maxDepth(TreeNode root) { 12 if(root == null){ 13 return 0; 14 } 15 LinkedList<TreeNode> stack = new LinkedList<>(); 16 int num = 0; 17 stack.add(root); 18 while(!stack.isEmpty()){ 19 num++; 20 int size = stack.size(); 21 for(int i = 0;i < size;i++){ 22 TreeNode cur = stack.pollFirst(); 23 if(cur.left != null){ 24 stack.add(cur.left); 25 } 26 if(cur.right != null){ 27 stack.add(cur.right); 28 } 29 } 30 } 31 return num; 32 } 33 }
5.主要没有考虑完善栈先进后出的特性。
记递归代码如下:
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 public int maxDepth(TreeNode root) { 12 if(root == null){ 13 return 0; 14 }else{ 15 int i = maxDepth(root.left); 16 int j = maxDepth(root.right); 17 return i = (i>j?i:j) + 1; 18 } 19 } 20 }
以上是关于Leetcode104 二叉树最大深度 踩坑的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode题目104.二叉树的最大深度(DFS+BFS简单)