剑指 offer代码解析——面试题39判断平衡二叉树

来源:互联网 发布:nginx luci 编辑:程序博客网 时间:2024/05/22 04:37

题目:输入一颗二叉树的根结点,判断该树是不是平衡二叉树。

如果某二叉树中任意结点的左右子树的高度相差不超过1,那么它就是一棵平衡二叉树。


分析:所谓平衡二叉树就是要确保每个结点的左子树与右子树的高度差在-1到1之间。

由于之前一题已经给出了二叉树高度的计算方法,因此本题最直观的思路就是分别计算每个结点的左子树高和右子树高,从而判断一棵树的所有结点是否均为平衡二叉树。

/** * 题目:输入一颗二叉树的根结点,判断该树是不是平衡二叉树。 * 如果某二叉树中任意结点的左右子树的高度相差不超过1,那么它就是一棵平衡二叉树。 * @author 大闲人柴毛毛 * @date 2016年4月2日 */public class BalanceTree {/** * 分析:所谓平衡二叉树就是要确保每个结点的左子树与右子树的高度差在-1到1之间。 * 由于之前一题已经给出了二叉树高度的计算方法,因此本题最直观的思路就是分别计算每个结点的左子树高和右子树高,从而判断一棵树的所有结点是否均为平衡二叉树。 * 代码如下: */public static <T> boolean isBalanceTree_1(Node<T> root){//健壮性判断:若树为空if(root==null){System.out.println("树为空!");return true;}// 计算左子树高int left_height = TreeHeight.getTreeHeight(root.left);// 计算右子树高int right_height = TreeHeight.getTreeHeight(root.right);// 计算高度差int mid = left_height - right_height;// 判断高度差是否为-1、0、1if (mid == -1 || mid == 0 || mid == 1)// 若当前结点是平衡二叉树,则计算左子树和右子树是否为平衡二叉树return (isBalanceTree_1(root.left) && isBalanceTree_1(root.right));// 若当前结点不是二叉平衡树,则返回falseelsereturn false;}/** * 测试 */public static void main(String[] args){//构造一棵平衡二叉树Node<Integer> node1 = new Node<Integer>();Node<Integer> node2 = new Node<Integer>();Node<Integer> node3 = new Node<Integer>();Node<Integer> node4 = new Node<Integer>();Node<Integer> node5 = new Node<Integer>();Node<Integer> node6 = new Node<Integer>();Node<Integer> node7 = new Node<Integer>();Node<Integer> node8 = new Node<Integer>();Node<Integer> node9 = new Node<Integer>();node1.data = 1;node2.data = 2;node3.data = 3;node4.data = 4;node5.data = 5;node6.data = 6;node7.data = 7;node8.data = 8;node9.data = 9;node1.left = node2;node1.right = node3;node2.left = node4;node2.right = node5;node5.left = node7;node3.right = node6;//node7.left = node8;//node8.left = node9;System.out.println(isBalanceTree_1(node1));}}


1 0