Fork me on GitHub

数据结构——平衡二叉树

特征

1、空树是平衡二叉树。
2、如果一棵树不为空,并且其中所有的子树都满足各自的左子树与右子树的高度差都不超过 1。

下面介绍一个简单应用,平衡二叉树的相关操作以后补充。

判断一棵二叉树是否为平衡二叉树

给定一颗二叉树的头结点 head,判断一棵树是否是平衡二叉树。

1.1、左子树是否为平衡二叉树
1.2、记录左子树的深度,最深到达哪一层,记为 LH
2.1、右子树是否为平衡二叉树
2.2、记录右子树的深度,最深到达哪一层,记为 RH
3、如果左子树或右子树有一个不是平衡二叉树,则整棵树就不是平衡二叉树
4、如果左、右子树都是平衡二叉树,那么再比较两者深度的差值,如果大于 1,那么就不是平衡二叉树,否则就是平衡二叉树。

public boolean check(TreeNode root) {
    boolean[] res = new boolean[1];
    res[0] = true;
    int level = 0;
    getHeight(root, level, res);// 获得以根结点为头的深度
    return res[0];
}

private int getHeight(TreeNode head, int level, boolean[] res) {
    if (head == null) return level; // 如果当前 head 为空,则返回当前所到达的深度
    int LH = getHeight(head.left, level+1, res); // 获得以当前 head 为头的左子树深度
    if (!res[0]) return level; // 如果以当前 head 为头的左子树不是 AVL,直接返回当前所到达的深度
    int RH = getHeight(head.right, level+1, res); // 获得以当前 head 为头的右子树深度
    if (!res[0]) return level; // 如果以当前 head 为头的右子树不是 AVL,直接返回当前所达到的深度
    if (Math.abs(LH - RH) > 1) res[0] = false; // 比较以当前 head 为头的左子树深度和右子树深度,如果其相差大于 1,则说明以当前 head 为头的二叉树不是 AVL
    return Math.max(LH, RH); // 最后返回当前以 head 为头的深度
}

 

posted @ 2017-03-19 21:35  郑斌blog  阅读(729)  评论(0编辑  收藏  举报