leetcode104(二叉树的最大深度)
数据结构课上刷的,我感觉我开始对递归这个概念开始比较清晰了。
题目如下
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
首先我实现了两种做法,都是DFS,一种是递归实现,另一种是使用栈来实现。今天彻底理解了BFS和DFS之后,感觉我之前的博客一些方法归类可能有一些错误
1. 递归写法
解决递归问题的思路通常都是将一个大的问题递推分解为几个很容易解决的情况,再将这些情况加在一起,就是我们需要的答案,比如说,在这题里,我们需要求的是层数,然后一棵二叉树可以分解为许许多多个左树和右数,我们就通过递归,每递归找到一层,就加上1。
代码如下
class Solution {
public int maxDepth(TreeNode root) {
if(root == null)
{
return 0;
}
else
{
//相当与每找到一层就加上1,然后选取左子树和右子树中数值较大的一棵,返回答案
return java.lang.Math.max(maxDepth(root.left),maxDepth(root.right))+1;
}
}
}
2.使用栈来辅助实现DFS
这里我就是开了两个栈来辅助实现DFS
一个栈来保存节点,另一个栈来保存对应节点所在层数。
代码如下
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) return 0;
Stack<TreeNode> nodeList = new Stack<>();
Stack<Integer> numberList = new Stack<>();
nodeList.push(root);
numberList.push(1);
int depth = 1;
while(nodeList.size() != 0)
{
//temp表示所在层数,这也是这里比较难想到的地方,在两个判断外声明下面两个节点所在的层数,这样可以保持接下来在numberList中添加两个一样的数字。
int temp = numberList.pop();
TreeNode node = nodeList.pop();
if(node.left != null)
{
nodeList.push(node.left);
depth = java.lang.Math.max(temp+1, depth);
numberList.push(temp+1);
}
if(node.right != null)
{
nodeList.push(node.right);
depth = java.lang.Math.max(temp+1, depth);
numberList.push(temp+1);
}
System.out.println(temp);
}
return depth;
}
}