104.二叉树的最大深度
题目链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree/
思路:这个之前使用过层序遍历来解决问题,这里要使用深度优先遍历来解决问题
这里涉及到两个概念:二叉树的高度和深度
深度:任意一个节点到根节点的距离 (前序)
高度:任意一个节点到叶子节点的距离;(后序)
最大深度也就是求根节点到叶子节点的高度,这里用后序遍历
var maxDepth = function(root) {
const getDepth = (node) => {
if(node === null) return 0
const leftDepth = getDepth(node.left)
const rightDepth = getDepth(node.right)
let depth = 1 + Math.max(leftDepth, rightDepth)
return depth
}
return getDepth(root)
};
111.二叉树的最小深度
题目链接:. - 力扣(LeetCode)
思路:这个之前也是使用过层序遍历来解决问题,这里要使用深度优先遍历来解决问题;
和上题类似,但要考虑左子树孩子为空但右子树孩子不为空,或是相反的情况来辨别
var minDepth = function (root) {
const getDepth = (node) => {
if (node === null) return 0
let leftDepth = getDepth(node.left)
let rightDepth = getDepth(node.right)
let depth
if (leftDepth === 0) {
depth = 1 + rightDepth
} else if (rightDepth === 0) {
depth = 1 + leftDepth
} else {
depth = 1 + Math.min(leftDepth, rightDepth)
}
return depth
}
return getDepth(root)
};
222.完全二叉树的节点个数
题目链接:. - 力扣(LeetCode)
思路: 完全二叉树的定义;
var countNodes = function(root) {
function getNodeNum(node) {
if(node === null) return 0
let leftNodeNum = getNodeNum(node.left)
let rightNodeNum = getNodeNum(node.right)
nodeNum = 1 + leftNodeNum + rightNodeNum
return nodeNum
}
return getNodeNum(root)
};
这是普通二叉树的节点求法,这里并不了解完全二叉树的求法会有什么区别
看了卡哥的思路:
完全二叉树的特性是除了底层节点,上面的节点都是满的;而底层节点从左到右都是连续的;那么可以根据这一特性去判断子节点是否是满二叉树,如果是满二叉树,那就可以用公式来求出子树的节点数;
var countNodes = function(root) {
function getNum(node) {
if(node === null) return 0
let left = node.left
let right = node.right
let leftDepth = 0, rightDepth = 0
while(left) {
left = left.left
leftDepth = leftDepth + 1
}
while(right) {
right = right.right
rightDepth = rightDepth + 1
}
if(leftDepth === rightDepth) {
return Math.pow(2, leftDepth+1) -1
}
let allleftDepth = getNum(node.left)
let allrightDepth = getNum(node.right)
return 1 + allleftDepth + allrightDepth
}
return getNum(root)
};