题目
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例: 给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度3
思路
二叉树的深度和高度:
对于二叉树某个节点的深度:从上往下数,从根节点到该节点的最长简单路径的节点个数,因此访问节点的深度要用先序遍历
对于二叉树某个节点的高度:从下往上数,从叶子结点到该节点的最长简单路径的节点个数,因此访问节点的高度要用后序遍历
总结:起点不同,终点相同,深度和高度终点都是该节点,其中深度是从上往下,高度是从下往上
每层节点的深度和高度如图所示:
注意:高度和深度都是计算节点的个数。
1. 递归法
可以使用前序和后序,前序求的是深度(前序—>从上往下—>深度),后序求的是高度(后序—>从下往上—>高度)
根节点的高度 = 二叉树的最大深度,本题可以通过后序求的根节点高度从而求二叉树的最大深度
递归三部曲:递归函数的参数和返回值—>终止条件—>确定单层递归的逻辑
class Solution {
public int maxDepth(TreeNode root){
if(root == null) return 0;
int leftDepth = maxDepth(root.left);//先求左子树深度
int rightDepth = maxDepth(root.right);//再求右子树深度
return Math.max(leftDepth,rightDepth)+1;//最后取左右深度最大的数值+1,加一是因为计算的是左右子树的深度,并没有包括当前的根节点
}
}
//拓展:N叉树的最大深度
class Solution {
public int maxDepth(Node root) {
if (root == null) return 0;
int depth = 0;
if (root.children != null){
for (Node child : root.children){
depth = Math.max(depth, maxDepth(child));
}
}
return depth + 1; //中节点
}
}
- 迭代法
使用迭代法,层序遍历是最合适的,因为最大深度就是二叉树的层数
class Solution {
public int maxDepth(TreeNode root){
Queue<TreeNode> q = new LinkedList<>();
if(root != null){
q.add(root);
}
int depth = 0;
while(!q.isEmpty()){
int size = q.size();//记录当前队列的大小
for(int i = 0; i < size; i++){//或者用while(size-- > 0),size控制每层出多少个元素,比如最开始根节点为1,出一个元素,然后把两个左右子树加进去,此时队列长度为2,则出两个元素,并且分别把每个元素的左右子树加入队列,此时有4个元素,队列出四个元素,依次下去...
TreeNode node = q.poll();//出队头元素,并用node保存(方便后续判断它的左右子树并加入队列)
if(node.left != null){
q.offer(node.left);
}
if(node.right != null){
q.offer(node.right);
}
}
depth++;//每统计完一层结点则层数+1
}
return depth;
}
}
//拓展:N叉树的最大深度
class Solution {
public int maxDepth(Node root) {
if (root == null) return 0;
int depth = 0;
Queue<Node> que = new LinkedList<>();
que.offer(root);
while (!que.isEmpty()) {
int len = que.size();
while (len-- > 0) {
Node node = que.poll();
for (int i = 0; i < node.children.size(); i++)//把他的所有孩子都加进来
if (node.children.get(i) != null)
que.offer(node.children.get(i));
}
depth++;
}
return depth;
}
}