Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as:
| a binary tree in which the left and right subtrees of every node differ in height by no more than 1.
Example 1:
Input: root = [3,9,20,null,null,15,7]
Output: true
Example 2:
Input: root = [1,2,2,3,3,null,null,4,4]
Output: false
Example 3:
Input: root = []
Output: true
Constraints:
- The number of nodes in the tree is in the range [0, 5000].
- -104 <= Node.val <= 104
Java Completion:
class Solution {
/**
* 功能:判断是否是平衡二叉树
* 平衡二叉树(AVL):
* 1.可以是空树。
* 2.假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过 1。
*
* @param root
* @return
*/
public boolean isBalanced(TreeNode root) {
if (root == null) return true;
return (maxDepth(root) == -1) ? false : true;
}
/**
* 功能:计算二叉树的深度、高度差
*
* @param root
* @return
*/
public int maxDepth(TreeNode root) {
if (root == null) return 0;
int lDepth = maxDepth(root.left);
int rDepth = maxDepth(root.right);
if (lDepth == -1 || rDepth == -1 || Math.abs(lDepth - rDepth) > 1) return -1;
return 1 + (lDepth > rDepth ? lDepth : rDepth);
}
}
class Solution {
/**
* 功能:非递归实现判断是否是平衡二叉树
* 平衡二叉树(AVL):
* 1.可以是空树。
* 2.假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过 1。
*
* @param root
* @return
*/
public boolean isBalanced(TreeNode root) {
if (root == null) return true;
ArrayList<TreeNode> treeNodes = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode pop = stack.pop();
treeNodes.add(pop);
if (pop.left != null) stack.push(pop.left);
if (pop.right != null) stack.push(pop.right);
}
int index = treeNodes.size() - 1;
while (index >= 0) {
if (treeNodes.get(index).left == null && treeNodes.get(index).right == null) {
treeNodes.get(index).val = 1;
} else if (treeNodes.get(index).left == null) {
treeNodes.get(index).val = treeNodes.get(index).right.val + 1;
if (treeNodes.get(index).right.val > 1) return false;
} else if (treeNodes.get(index).right == null) {
treeNodes.get(index).val = treeNodes.get(index).left.val + 1;
if (treeNodes.get(index).left.val > 1) return false;
} else {
treeNodes.get(index).val = 1 + Math.max(treeNodes.get(index).left.val, treeNodes.get(index).right.val);
if (Math.abs(treeNodes.get(index).left.val - treeNodes.get(index).right.val) > 1) return false;
}
index--;
}
return true;
}
}