题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
思路
平衡二叉树:每个节点左右子树高度相差不超过1。思路1:最直接的做法,遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。
思路1的缺点是在判断上层节点时,会多次重复遍历下层节点,增加了不必要的开销。
思路2(剪枝):从下往上遍历(后序遍历),如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,这样至多对每个节点访问一次.(加剪枝,就是最优解啦~)
解法1
public class Solution { public boolean IsBalanced_Solution(TreeNode root) { if (root == null) // 返回true哦 return true; int leftDepth = treeDepth(root.left); int rightDepth = treeDepth(root.right); int diff = Math.abs(leftDepth - rightDepth); if (diff > 1) return false; // 要返回一个和递归终止条件相反的结果 return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right); } // 获取二叉树的深度 private int treeDepth(TreeNode root){ if (root == null) return 0; int left = treeDepth(root.left); int right = treeDepth(root.right); return Math.max(left,right) + 1; } }
☆☆解法2
//如果不平衡,则令树的深度=-1,用来表示树不平衡。最终根据树的深度是否等于-1来确定是否为平衡树。 //在判断出树不平衡后,进行剪枝(即代码中直接返回-1,不再对其他子树进行判断),以提高效率。 public class Solution { public boolean IsBalanced_Solution(TreeNode root) { return getDepth(root) != -1; } private int getDepth(TreeNode root) { if (root == null) return 0; int left = getDepth(root.left); if (left == -1) return -1; int right = getDepth(root.right); if (right == -1) return -1; return Math.abs(left-right) > 1 ? -1 : Math.max(left,right) + 1; } }