publicbooleanIsBalanced_Solution(TreeNode pRoot){if(pRoot == null){returntrue;}int left =TreeDepth(pRoot.left);int right =TreeDepth(pRoot.right);int diff = left - right;//判断高度差if(diff >1|| diff <-1){returnfalse;}//由于从上到下的遍历思想,所以左右子节点也要同样的判断,这里就导致了底层的树深会被计算多次,增加额外开销。returnIsBalanced_Solution(pRoot.right)&&IsBalanced_Solution(pRoot.left);}privateintTreeDepth(TreeNode pRoot){if(pRoot == null){return0;}int left =TreeDepth(pRoot.left);int right =TreeDepth(pRoot.right);return1+ Math.max(left,right);}
实现二,剪枝思路,从下到上遍历的思路:
publicclassSolution{publicbooleanIsBalanced_Solution(TreeNode root){returngetDepth(root)!=-1;}privateintgetDepth(TreeNode root){if(root == null)return0;//左子树深度int left =getDepth(root.left);if(left ==-1)return-1;//剪枝//右子树深度int right =getDepth(root.right);if(right ==-1)return-1;//剪枝//左右子树的深度差的绝对值大于1,不是平衡二叉树,直接返回-1; 否则,返回树深return Math.abs(left - right)>1?-1:1+ Math.max(left, right);}}