二叉树的深度
题目描述
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
例如:
给定二叉树 [3, 9, 20, null, null, 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
|
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
|
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
|
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; } }
|