给定一个二叉树 root
,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:3
文章讲解:代码随想录
视频讲解:二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | LeetCode:104.二叉树的最大深度_哔哩哔哩_bilibili
第一印象:深度优先搜索和广度优先搜索都能做。
// 广度优先搜索
class Solution {
public int maxDepth(TreeNode root) {
int result = 0;
if (root == null) return result;
Queue<TreeNode> queue = new LinkedList<>();
TreeNode node = root;
queue.offer(node);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
node = queue.poll();
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
result++;
}
return result;
}
}
// 深度优先搜索1
class Solution {
int result = 0;
public int maxDepth(TreeNode root) {
max(root, 0);
return result;
}
public void max(TreeNode node, int tmp) {
if (node == null) return;
tmp++;
result = result > tmp ? result : tmp;
max(node.left, tmp);
max(node.right, tmp);
tmp--;
}
}
// 深度优先搜索2
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;
}
}
给定一个 N 叉树,找到其最大深度。
最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。
示例 1:
输入:root = [1,null,3,2,4,null,5,6] 输出:3
第一印象:深度优先搜索和广度优先搜索。
// 深度优先搜索
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(Node root) {
int result = 0;
if (root == null) return result;
Queue<Node> queue = new LinkedList<>();
Node node = root;
queue.offer(node);
while (!queue.isEmpty()) {
int size = queue.size();
while (size-- > 0) {
node = queue.poll();
for (Node child : node.children) {
queue.offer(child);
}
}
result++;
}
return result;
}
}
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:2
文章讲解:代码随想录
视频讲解:看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度_哔哩哔哩_bilibili
// 广度优先搜索
class Solution {
public int minDepth(TreeNode root){
if (root == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
TreeNode node = root;
queue.offer(node);
int depth = 0;
while (!queue.isEmpty()){
int size = queue.size();
depth++;
for (int i = 0; i < size; i++) {
node = queue.poll();
if (node.left == null && node.right == null){
return depth;
}
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
}
return depth;
}
}
// 深度优先搜索
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(leftDepth, rightDepth) + 1;
}
}
给你一棵 完全二叉树 的根节点 root
,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h
层,则该层包含 1~ 2h
个节点。
示例 1:
输入:root = [1,2,3,4,5,6] 输出:6
文章讲解:代码随想录
视频讲解:要理解普通二叉树和完全二叉树的区别! | LeetCode:222.完全二叉树节点的数量_哔哩哔哩_bilibili
收获:要理解完全二叉树和二叉树的区别,完全二叉树就是除了最后一层可以残缺,以上树枝必须是满的二叉树。
// 深度优先搜索
class Solution {
public int countNodes(TreeNode root) {
if (root == null) return 0;
return countNodes(root.left) + countNodes(root.right) + 1;
}
}
// 广度优先搜索
class Solution {
public int countNodes(TreeNode root) {
if (root == null) return 0;
int result = 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
root = queue.poll();
result++;
if (root.left != null) {
queue.offer(root.left);
}
if (root.right != null) {
queue.offer(root.right);
}
}
}
return result;
}
}