开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情
1.二叉树的最大深度
题目描述
解题思路
本题可以采用递归法和二叉树的层序遍历来求二叉树的最大深度。
递归法:
1.确定递归参数和返回值,参数为二叉树的节点,返回值为二叉树的最大深度
2.确定递归终止条件,当节点为null时,return 0
3.确定单层逻辑,求当前节点的左右子树的最大深度的最大值
var maxDepth = function(root) {
var getPath = function(node) {
if(node == null) return 0
let leftDep = getPath(node.left)
let rightDep = getPath(node.right)
return 1 + Math.max(leftDep,rightDep)
}
return getPath(root)
};
层序遍历: 采用一个辅助队列来存放每层数据,每层遍历结束后,二叉树的最大深度加1
var maxDepth = function(root) {
if (root == null) return 0
let dep = 0;
let stack = []
stack.push(root)
while(stack.length) {
const size = stack.length;
for(let i = 0;i<size;i++){
const node = stack.shift()
node.left && stack.push(node.left)
node.right && stack.push(node.right)
}
dep++
}
return dep
};
2.二叉树的最小深度
题目描述
解题思路
本题解法和二叉树的最大深度差不多,需要注意的是,判断递归的终止条件和单层数据处理逻辑有些许不同,最小深度是从根节点到最近叶子节点的最短路径上的节点数量,一定是要到叶子节点(左右子节点未空),9是叶子节点,20不是。
var minDepth = function(root) {
if(root == null) return 0;
let leftDep = minDepth(root.left)
let rightDep = minDepth(root.right)
if(root.left == null && root.right!==null) { // 非叶子节点
return 1 + rightDep
} else if(root.left !== null && root.right == null) { // 非叶子节点
return 1 + leftDep
} else { // 叶子节点
return 1 + Math.min(leftDep,rightDep)
}
};
题目描述
解题思路
递归法:
1.确定递归参数和返回值,本题参数为一个节点,返回值为节点个数
2.确定递归终止条件,当节点为空时,返回0
3.确定单层逻辑,计算当前节点的左右子树节点个数
var countNodes = function(root) {
var getNodeCount = function(node){
if(node == null) return 0;
let left = getNodeCount(node.left)
let right = getNodeCount(node.right)
return left + right + 1
}
return getNodeCount(root)
};
层序遍历所有节点
var countNodes = function(root) {
if(root === null) return 0
let count = 0
const queue = []
queue.push(root)
while(queue.length){
let len = queue.length
while(len--){
count++
const node = queue.shift()
node.left&&queue.push(node.left)
node.right&&queue.push(node.right)
}
}
return count
};