二叉树的深度

二叉树的深度

题目描述

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。

例如:

给定二叉树 [3, 9, 20, null, null, 15, 7]

1
2
3
4
5
  3
/ \
9 20
/ \
15 7

返回它的最大深度 3 。

限制

节点总数 <= 10000

题目来源:力扣(LeetCode)
题目链接:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof
题目著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一

利用二叉树的递归特性,一个二叉树的深度就等于其左右子树的深度中较深的那个深度加 1,即有:depth(tree) = max(depth(left), depth(right)) + 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 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;
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}
}

解法二

利用深度优先遍历来访问二叉树中的节点,在访问这些节点时,利用另一个栈来记录每个节点所处的深度,并和最大深度进行比较,下面是非递归实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* 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) {
Stack<TreeNode> stack = new Stack<>();
Stack<Integer> levelStack = new Stack<>();
int maxLevel = 0;
if (root != null) {
levelStack.push(1);
stack.push(root);
}
while (!stack.empty()) {
TreeNode rootNode = stack.pop();
int currentLevel = levelStack.pop();
maxLevel = Math.max(maxLevel, currentLevel);
TreeNode leftNode = rootNode.left;
TreeNode rightNode = rootNode.right;
if (leftNode != null) {
levelStack.push(currentLevel + 1);
stack.push(leftNode);
}
if (rightNode != null) {
levelStack.push(currentLevel + 1);
stack.push(rightNode);
}
}
return maxLevel;
}
}

但是这样做需要记录每个节点的深度,这个过程很耗时,下面使用广度优先遍历来解决这个问题。

解法三

也可以使用广度优先遍历来遍历二叉树,也就是层次遍历,这样即可得到总共的层数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 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) {
Queue<TreeNode> queue = new LinkedList<>();
int level = 0;
if (root != null) queue.offer(root);
while (queue.size() != 0) {
level++;
int count = queue.size();
for (int i = 0; i < count; i++) {
TreeNode rootNode = queue.poll();
TreeNode leftNode = rootNode.left;
TreeNode rightNode = rootNode.right;
if (leftNode != null) queue.offer(leftNode);
if (rightNode != null) queue.offer(rightNode);
}
}
return level;
}
}