104.二叉树的最大深度 (优先掌握递归)
题目链接/文章讲解/视频讲解: 代码随想录
后序
n叉树的最大深度
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> children;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val, List<Node> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public int maxDepth(Node root) {
if(root == null) return 0;
int depth = 0;
for(Node child : root.children) {
if(child != null) {
depth = Math.max(depth, maxDepth(child));//depth比较的是当前child的深度与其他child深度
//如果depth = maxDepth(child) 的话,depth最终等于最右边节点的深度
}
}
return depth + 1;
}
}
二叉树的最大深度
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
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;//中
}
}
111.二叉树的最小深度 (优先掌握递归)
题目链接/文章讲解/视频讲解:代码随想录
相较于二叉树的最大深度而言,多了左右子树是否为空节点的判断,目的是为了防止出现当根节点的左孩子为空右孩子不为空时最小深度判断错误。
class Solution {
public int minDepth(TreeNode root) {
if(root == null) {
return 0;
}
int leftDepth = minDepth(root.left);
int rightDepth = minDepth(root.right);
if(root.left == null) return rightDepth+1;
if(root.right == null) return leftDepth+1;
return Math.min(rightDepth, leftDepth) + 1;
}
}
222.完全二叉树的节点个数(优先掌握递归)
题目链接/文章讲解/视频讲解:代码随想录
普通二叉树
class Solution {
public int countNodes(TreeNode root) {
if(root == null) return 0;
int leftCount = countNodes(root.left);
int rightCouont = countNodes(root.right);
return leftCount + rightCouont + 1;
}
}
完全二叉树
class Solution {
public int countNodes(TreeNode root) {
if(root == null) return 0;
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;
}
return countNodes(root.left) + countNodes(root.right) + 1;
}
}