剑指 Offer 55 - I. 二叉树的深度
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
题意理解: 深度优先 中序遍历
- 声明变量一个用来存储当前层数,一个用来存储当前最大层数
- 递归二叉树,符合条件深度+1,为子节点深度-1;
- 比较当前层数和当前最大层数
- 返回最大层数
提示: 节点总数 <= 10000
var maxDepth = function (root) {
if (!root) return 0;
let max = 1;
let current = 1;
function deep(root) {
if (!root) return;
current++;
deep(root.left)
deep(root.right)
current--;
max = Math.max(current, max)
}
deep(root)
return max;
};
剑指 Offer 55 - II. 平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
题意理解: 平衡二叉树:二叉树的每个节点的左右子树的高度差的绝对值不超过 1,则二叉树是平衡二叉树
- 深度优先,先序遍历
- 节点不存在返回true
- 递归遍历,不符合条件设为-1,直接返回
- 递归左右子树,判断各个节点是否否和条件
限制: 0 <= 树的结点个数 <= 10000
var isBalanced = function(root) {
if (!root) return true;
function height(root) {
if (!root) {
return 0;
}
let leftHeight = height(root.left);
let rightHeight = height(root.right);
if (leftHeight === -1 || rightHeight === -1 || Math.abs(leftHeight - rightHeight) > 1) {
return -1;
} else {
return Math.max(leftHeight, rightHeight) + 1;
}
}
return height(root)>=0
};