关闭

《剑指offer》——平衡二叉树

标签: 算法java牛客剑指offer
395人阅读 评论(0) 收藏 举报
分类:

T:

题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。

该题目我想了好久,总是想在一个递归函数内解决这个问题,最后没能找出解决方案。

本题的关键在于两个部分的求解:

  1. 要计算每个节点的深度(或者计算该节点两个孩子节点的深度);
  2. 根据两个子节点的深度差判断该以该节点为子树的结构是否为平衡二叉树。

第一个问题的求解,就需要递归解决,第二个问题,也要递归解决。

比如:

节点a的两个子节点的深度差小于等于1,还要继续看两个子节点是否各自满足这个条件,即对每个子节点来说,其两个子节点是否也满足深度差小于等于1,如此递归下去,直到叶节点。

两个问题,就需要两个递归函数,各自执行各自的功能,而问题2的求解依赖于问题1的答案。

code:

    /**
     * T: 平衡二叉树
     * 
     * 题目描述 
     * 输入一棵二叉树,判断该二叉树是否是平衡二叉树。
     * 
     * date: 2015.11.21  17:14
     * @author SSS
     *
     */
    public class Solution {

        /**
         * 该函数的功能:
         * 判断当前节点的左右节点其高度差是否大于1.
         * 当大于1的时候返回false;
         * 当不大于1的时候,要看其两个子节点是否也满足该条件。
         * @param root
         * @return
         */
        public boolean IsBalanced_Solution(TreeNode root) {
            if (root == null) {
                return true;
            }

            int leftDepth = this.getDepth(root.left);
            int rightDepth = this.getDepth(root.right);

            if (Math.abs(leftDepth - rightDepth) > 1) {
                return false;
            }

            return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
        }

        /**
         * 该函数的功能:当前节点为根节点的子树的深度
         * @param rootTreeNode
         * @return
         */
        public int getDepth(TreeNode rootTreeNode) {
            if (rootTreeNode == null) {
                return 0;
            }

            int leftDepth = getDepth(rootTreeNode.left);
            int rightDepth = getDepth(rootTreeNode.right);

            int depth = Math.max(leftDepth, rightDepth);
            return depth + 1;
        }
    }
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:40243次
    • 积分:1147
    • 等级:
    • 排名:千里之外
    • 原创:79篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类