学习目标:
- 104.二叉树的最大深度
- 111.二叉树的最小深度
- 222.完全二叉树的节点个数
学习内容:
104.二叉树的最大深度
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始)
题目链接&&文章讲解
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
class Solution {
//返回值:int 参数:node
public int maxDepth(TreeNode root) {
//终止条件:节点为空 返回0
if(root == null) return 0;
//处理逻辑:比较左右子树高度
//后序遍历,把左右子树结果返回父节点比较
int left = maxDepth(root.left);//左
int right = maxDepth(root.right);//右
int res = Math.max(left,right) + 1;//中
return res;
}
}
111.二叉树的最小深度
题目链接&&文章讲解
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
相比最大深度,需要判断左右子树是否为空的情况
class Solution {
public int minDepth(TreeNode root) {
if(root == null) return 0;
//处理逻辑 后序遍历
int left = minDepth(root.left);
int right = minDepth(root.right);
if(root.left == null &&root.right !=null) return right + 1;
if(root.left != null &&root.right ==null) return left + 1;
int res = Math.min(left,right) + 1;
return res;
}
}
222.完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。
//普通后序遍历
class Solution {
public int countNodes(TreeNode root) {
if(root == null) return 0;
int left = countNodes(root.left);
int right = countNodes(root.right);
int res = left + right + 1;
return res;
}
}
//将完全二叉树拆分为满二叉树子树
class Solution {
public int countNodes(TreeNode root) {
//终止条件1:node为空
if(root == null) return 0;
//终止条件2:子树为满二叉树
TreeNode left = root.left;
TreeNode right = root.right;
int leftDepth = 0;
int rightDepth = 0;
while(left != null){
left = left.left;
leftDepth++;
}
while(right != null){
right = right.right;
rightDepth++;
}
if(leftDepth == rightDepth) return (2 << leftDepth) - 1;
//处理逻辑
int leftNode = countNodes(root.left);
int rightNode = countNodes(root.right);
int res = leftNode + rightNode + 1;
return res;
}
}