I题目描述:
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
解析:
1.终止条件:当 root为空,说明已越过叶节点,因此返回深度0
2.递推工作:本质上是对树做后序遍历。
计算节点 root的左子树的深度,即调用 maxDepth(root.left);
计算节点 root的右子树的深度,即调用 maxDepth(root.right);
3.返回值:返回此树的深度,即 max(maxDepth(root.left), maxDepth(root.right)) + 1。
Java:
public int maxDepth(TreeNode root) {
if(root == null) {
return 0;
}
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}
JavaScript:
var maxDepth = function(root) {
if(root === null) {
return 0;
}
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
};
II题目描述:
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
解析:
库函数加平衡二叉树判断
1.首先判断根节点是否为空,若为空,直接返回true
2.定义左右子树的高度(调用maxDepth函数)
判断是否为平衡二叉树,若不为平衡二叉树,则返回false
若为平衡二叉树,则继续遍历左右子树的节点
3.maxDepth函数为二叉树的高度
Java:
public boolean isBalanced(TreeNode root) {
if(root == null) {
return true;
}
int left = MaxDepth(root.left);
int right = MaxDepth(root.right);
if((left - right) > 1 || (left - right) < -1) {
return false;
} else {
return isBalanced(root.left) && isBalanced(root.right);
}
}
public int MaxDepth(TreeNode root) {
if(root == null) {
return 0;
}
return Math.max(MaxDepth(root.left), MaxDepth(root.right)) + 1;
}
JavaScript:
var isBalanced = function(root) {
if(root === null) {
return true;
}
let left = MaxDepth(root.left);
let right = MaxDepth(root.right);
if((left - right) > 1 || (left - right) < -1) {
return false;
} else {
return isBalanced(root.left) && isBalanced(root.right);
}
function MaxDepth(root) {
if(root === null) {
return 0;
}
return Math.max(MaxDepth(root.left), MaxDepth(root.right)) + 1;
}
};