代码随想录刷题笔记Day15-- 二叉树 二叉树的最大深度 二叉树的最小深度 完全二叉树的节点个数
LeetCode 104. 二叉树的最大深度
题目描述:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例 1:
给定二叉树 [3,9,20,null,null,15,7],
返回它的最大深度 3 。
解题思路
使用队列解决这个问题
解法:
写法
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var maxDepth = function(root) {
let maxdep=0,dep=0;
let val=[];
const inorder=(root)=>{
if(root==null) return;
val.push(root.val);
if(root.left==null&&root.right==null)
{
maxdep=maxdep>val.length?maxdep:val.length;
}
inorder(root.left);
inorder(root.right);
val.pop();
}
inorder(root);
return maxdep;
};
LeetCode 111. 二叉树的最小深度
题目描述:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
**说明:**叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
解题思路
解法:
写法
var minDepth = function(root) {
if (!root) {
return 0;
}
function helper(node, level) {
// 当前层次+1
const clevel = level + 1;
// 左右节点都没有,则返回当前层级
if (!node.left && !node.right) {
return clevel;
}
// 有左子树,没有右子树,返回左子树深度
if (node.left && !node.right) {
return helper(node.left, clevel);
}
// 有右子树,没有左子树,返回右子树深度
if (node.right && !node.left) {
return helper(node.right, clevel);
}
// 左右子树都有,则取左、右子树层深的最小值
return Math.min(helper(node.left, clevel), helper(node.right, clevel));
}
return helper(root, 0);
};
LeetCode 222. 完全二叉树的节点个数
题目描述:
给你一棵 完全二叉树 的根节点 root
,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h
层,则该层包含 1~ 2h
个节点。
示例 1:
输入:root = [1,2,3,4,5,6]
输出:6
解题思路
解法:
写法
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var countNodes = function(root) {
//递归法计算二叉树节点数
// 1. 确定递归函数参数
const getNodeSum = function(node) {
//2. 确定终止条件
if(node === null) {
return 0;
}
//3. 确定单层递归逻辑
let leftNum = getNodeSum(node.left);
let rightNum = getNodeSum(node.right);
return leftNum + rightNum + 1;
}
return getNodeSum(root);
};