题干描述
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
示例: 给定二叉树 [3,9,20,null,null,15,7],
返回它的最大深度 3 。
解题思路
递归法
本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。(这一点是很多同学没有想清楚以及很多题解中没有讲清楚的)
使用后序遍历(左右中)来计算树的高度。
1. 确定递归函数的参数和返回值
参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。
int getdepth(TreeNode* node);
2. 确定终止条件
如果为空节点的话,就返回0,表示高度为0。
if(node == NULL) return 0;
3. 确定单层递归的逻辑
先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值,再+1(加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。
int leftdepth = getdepth(node->left); // 左
int rightdepth = getdepth(node->right); // 右
int depth = 1 + max(leftdepth, rightdepth); // 中
return depth;
本题也可以使用前序。
迭代法
使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。
在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示:
具体代码
递归法
// 104.二叉树的最大深度 - 递归法
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;
}
递归法(求深度法)
// 101.对称二叉树
// 定义最大深度
int maxnum = 0;
public int maxDepth2(TreeNode root){
ans(root, 0);
return maxnum;
}
// 递归求解最大深度
void ans(TreeNode tr, int tmp){
if(tr==null) return;
tmp++;
maxnum = maxnum<tmp?tmp:maxnum;
ans(tr.left, tmp);
ans(tr.right, tmp);
tmp--;
}
迭代法(层序遍历)
public int maxDepth3(TreeNode root){
if(root == null){
return 0;
}
Deque<TreeNode> deque = new LinkedList<>();
deque.offer(root);
int depth = 0;
while(!deque.isEmpty()){
int size = deque.size();
depth++;
for(int i = 0; i < size; i++){
TreeNode node = deque.poll();
if(node.left != null){
deque.offer(node.left);
}
if(node.right != null){
deque.offer(node.right);
}
}
}
return depth;
}
参考资料:104.二叉树的最大深度