给定一个二叉树,确定它是高度平衡的。对于这个问题,一棵高度平衡的二叉树的定义是:一棵二叉树中每个节点的两个子树的深度相差不会超过1。
解题思路:一种想法是写一个计算深度的函数,判断左右的深度差是否大于1,然后递归判断左右子树是否平衡。另一种用dfs去计算节点的最大深度,如果最大深度,如果左右子树不平衡或者差大于1就返回false。
一刷ac
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: True if this Binary tree is Balanced, or false.
*/
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
if(Math.abs(depth(root.left)-depth(root.right)) > 1) return false;
return isBalanced(root.left) && isBalanced(root.right);
}
public int depth(TreeNode root){
if(root == null) return 0;
return Math.max(depth(root.left), depth(root.right))+1;
}
}
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: True if this Binary tree is Balanced, or false.
*/
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
if(dfs(root) > 0) return true;
return false;
}
public int dfs(TreeNode root){
if(root == null) return 0;
int left = dfs(root.left);
int right = dfs(root.right);
if(left < 0 || right < 0 || Math.abs(left-right) > 1) return -1;
return Math.max(left, right)+1;
}
}
下面的解法来自于leetcode,是基于后序遍历的解法。留坑待填
public class Solution {
public boolean isBalanced(TreeNode root) {
if(root==null) return true;
Stack<TreeNode> stack = new Stack<TreeNode>();
Map<TreeNode, Integer> map = new HashMap<TreeNode, Integer>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
if((node.left==null || node.left!=null && map.containsKey(node.left)) &&(node.right==null || node.right!=null && map.containsKey(node.right))){
int left = node.left==null?0:map.get(node.left);
int right = node.right==null?0:map.get(node.right);
if(Math.abs(left-right) > 1) return false;
map.put(node, Math.max(left, right)+1);
}else{
if(node.left!=null && !map.containsKey(node.left)){
stack.push(node);
stack.push(node.left);
}else{
stack.push(node);
stack.push(node.right);
}
}
}
return true;
}
}