问题描述
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
解题思路
从根节点开始计算,分别得到节点的左右子树深度。然后计算左右子树的深度差是否大于1即可。
由于二叉树的孩子节点本身也是一颗二叉树。所以这里可以通过递归的方法从叶子节点开始计算子树是否平衡,然后逐级上升,再计算当前节点的父节点所构成的子树是否平衡。直到计算到整棵树的根节点是否平衡为止。
代码示例
定义树:
public class TreeNode { private int val; private TreeNode left; private TreeNode right; public TreeNode(int val){ this.val = val; } }
判断树是否平衡
public boolean isBalance(TreeNode treeNode) { // 叶子节点的子节点为NULL if(treeNode == null) { return true; } // 当前节点的左子树不平衡,返回false if(!isBalance(treeNode.getLeft())) { return false; } // 当前节点的右子树不平衡,返回false if(!isBalance(treeNode.getRight())) { return false; } // 计算当前节点是否平衡 // 1. 获取左子树深度 int leftHigh = getHigh(treeNode.getLeft()); // 2. 获取右子树深度 int rightHigh = getHigh(treeNode.getRight()); // 3. 判断深度差是否大于1,大于1 不平衡 return Math.abs(leftHigh - rightHigh) <= 1; }
获取树的深度
/** * 计算给定树的深度 * @param node 给定树 * @return */ private int getHigh(TreeNode node) { if(node == null) { return 0; } // 计算左子树深度 int leftHigh = getHigh(node.getLeft()) + 1; // 计算右子树深度 int rightHigh = getHigh(node.getRight()) + 1; // 返回最大深度 return Math.max(leftHigh, rightHigh); }