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 二叉树最大深度 踩坑的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode104. 二叉树的最大深度(dfs)

Leetcode题目104.二叉树的最大深度(DFS+BFS简单)

⭐算法入门⭐《二叉树》简单04 —— LeetCode 104. 二叉树的最大深度

[LeetCode] 104. 二叉树的最大深度

leetcode 104. 二叉树的最大深度

Leetcode | 104. 二叉树的最大深度