一、题意再现:
给定一个二叉树(注意,并未指定为二叉排序树,所以不可归并为平衡二叉树问题),判断是否平衡。
平衡:任意节点的左子树和右子树深度(高度)之差的绝对值不超过1。
二、算法1
1.思想:从上而下进行对于每个节点进行遍历,算出每个节点的左子树和右子树高度,这是一层递归。
对于指定位于某个高度的节点来说,算出此节点所在的高度。
注意:递归到哪一个节点,高度从这层开始,1开始增加。
2.代码:
public class Solution {
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
int leftHeight = getHeight(root.left, 1);
int rightHeight= getHeight(root.right, 1);
if(Math.abs(leftHeight - rightHeight) > 1){
return false;
}else{
return isBalanced(root.left) && isBalanced(root.right);
}
}
public int getHeight(TreeNode tn, int height){
if(tn == null) return height;
return Math.max(getHeight(tn.left, height+1), getHeight(tn.right, height+1));
}
}
三、算法2
1. 思想:从最底层叶子节点开始遍历,如果该节点满足平衡条件,则将其添加到HashMap表中。
2. 代码:
public class Solution {
HashMap<TreeNode, Integer> map = new HashMap<TreeNode, Integer>();
public boolean isBalanced(TreeNode root) {
if(root == null){
map.put(null, 0);
return true;
}
if(isBalanced(root.left) && isBalanced(root.right)){
if(Math.abs(map.get(root.left) - map.get(root.right)) > 1){
return false;
}else{
map.put(root, Math.max(map.get(root.left),map.get(root.right)) + 1);
return true;
}
}else{
return false;
}
}
}