Loading

110. 平衡二叉树

110. 平衡二叉树

https://leetcode-cn.com/problems/balanced-binary-tree/description/

package com.test;

/**
 * @author stono
 * @date 2018/9/1
 */
public class Lesson110 {
    public static void main(String[] args) {
        TreeNode t1 = new TreeNode(1);
        TreeNode t2 = new TreeNode(2);
        TreeNode t3 = new TreeNode(3);
        t1.left = t2;
        t1.right = t3;
        TreeNode.printNode(t1);
        boolean balanced = isBalanced(t1);
        System.out.println(balanced);
    }
    public static boolean isBalanced(TreeNode root) {
        if (root == null) {
            return true;
        }
        return judegeLeftRight(root.left,root.right);
    }

    private static boolean judegeLeftRight(TreeNode left, TreeNode right) {
        // 判断根是否是平衡的
        int res = Math.abs(treeHigh(left) - treeHigh(right));
        if (res > 1) {
            return false;
        }
        // 判断左右两个树是否是平衡的
        return isBalanced(left) && isBalanced(right);
    }

    /**
     * 计算树的高度
     * @param left
     * @return
     */
    private static int treeHigh(TreeNode left) {
        if (left == null) {
            return 0;
        }
        return 1+Math.max(treeHigh(left.left),treeHigh(left.right));
    }
}

速度不是特别快,把树的高度缓存了,还是不快:

package com.test;

import java.util.HashMap;
import java.util.Map;

/**
 * @author stono
 * @date 2018/9/1
 */
public class Lesson110_v2 {
    public static void main(String[] args) {
        TreeNode t1 = new TreeNode(1);
        TreeNode t2 = new TreeNode(2);
        TreeNode t3 = new TreeNode(3);
        t1.left = t2;
        t1.right = t3;
        TreeNode.printNode(t1);
        boolean balanced = isBalanced(t1);
        System.out.println(balanced);
    }
    public static boolean isBalanced(TreeNode root) {
        if (root == null) {
            return true;
        }
        return judegeLeftRight(root.left,root.right);
    }

    private static boolean judegeLeftRight(TreeNode left, TreeNode right) {
        Map<TreeNode, Integer> treeNodeHighMap = new HashMap<>(8);
        // 判断根是否是平衡的
        int res = Math.abs(treeHigh(left,treeNodeHighMap) - treeHigh(right, treeNodeHighMap));
        if (res > 1) {
            return false;
        }
        // 判断左右两个树是否是平衡的
        return isBalanced(left) && isBalanced(right);
    }

    /**
     * 计算树的高度,计算过程中将TreeNode高度缓存
     * @param left
     * @return
     */
    private static int treeHigh(TreeNode left, Map<TreeNode, Integer> treeNodeHighMap) {
        // 先来取一下
        Integer integer = treeNodeHighMap.get(left);
        if (integer != null) {
            return integer;
        }
        if (left == null) {
            treeNodeHighMap.put(left, 0);
            return 0;
        }
        treeNodeHighMap.put(left, 1+Math.max(treeHigh(left.left, treeNodeHighMap),treeHigh(left.right, treeNodeHighMap)));
        return treeNodeHighMap.get(left);
    }
}

 

posted @ 2018-09-01 22:47  stono  阅读(170)  评论(0编辑  收藏  举报