题目描述
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
解法
解法1 用栈实现的DFS
在leetcode的题解栏目里没有找到非递归的DFS算法,百度了一下也只找到了js写的非递归法,为了以后自己复习方便,特此记录
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int maxDepth(TreeNode root) {
HashMap<TreeNode, Integer> map = new HashMap<>();
Stack<TreeNode> stack = new Stack<>();
int maxDep = 0;
if (root != null)
{
stack.push(root);
map.put(root, 1);
}
while (!stack.isEmpty())
{
TreeNode tmp = stack.pop();
int currDep = map.get(tmp);
maxDep = Math.max(maxDep, currDep);
if (tmp.left != null)
{
stack.push(tmp.left);
map.put(tmp.left, currDep + 1);
}
if (tmp.right != null)
{
stack.push(tmp.right);
map.put(tmp.right, currDep + 1);
}
}
return maxDep;
}
}
解法2 用队列实现的BFS
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) return 0;
int maxDep = 0;
Queue<TreeNode> queue = new LinkedList<>();
((LinkedList<TreeNode>) queue).add(root);
while (!queue.isEmpty())
{
maxDep++;
int n = queue.size();
for (int i = 0; i < n; i++)
{
TreeNode tmp = queue.poll();
if (tmp.right != null) ((LinkedList<TreeNode>) queue).add(tmp.right);
if (tmp.left != null) ((LinkedList<TreeNode>) queue).add(tmp.left);
}
}
return maxDep;
}
}