leetcode110. 平衡二叉树(判断是不是)

传送门

题目:给定一个二叉树,判断它是否是高度平衡的二叉树。一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

方法1. 自顶向下 (重复递归)

	public boolean isBalanced(TreeNode root) {
    
    
        if (root == null) return true;
         // 后根遍历
        boolean isLeftBanlanced = isBalanced(root.left); 
        boolean isRightBanlanced = isBalanced(root.right);
        
        if (!(isLeftBanlanced & isRightBanlanced)) return false; //左右子树不平衡
        int leftHigh = getTreeHigh(root.left); // 左子树高
        int rightHigh = getTreeHigh(root.right);//右子树高

        if (Math.abs(leftHigh - rightHigh) > 1) return false;
        return true;
    }
    public int getTreeHigh(TreeNode root) {
    
     // 返回树高
        if (root == null) return 0;
        return 1 + Math.max(getTreeHigh(root.left), getTreeHigh(root.right));
    }

方法2. 自底向上(优化)

 	public boolean isBalanced(TreeNode root) {
    
    
        return getTreeHigh(root) != -1;
	}
	// 返回树高,计算树高的过程中,判断是否平衡;-1:不平衡;否则,平衡
    int getTreeHigh(TreeNode root) {
    
     
        if (root == null) return 0;

        int leftHigh = getTreeHigh(root.left);
        if (leftHigh == -1) return -1; //左子树不平衡直接返回, 不能省略这里的提前判断

        int rightHigh = getTreeHigh(root.right);
        if (rightHigh == -1) return -1; //右子树不平衡直接返回, 不能省略这里的提前判断

        //不要像下面执行左右递归之后再判断返回值是不是-1,执行一次判断一次,更好的剪枝
        //if (leftHigh == -1 || rightHigh == -1) return -1;
        if (Math.abs(leftHigh - rightHigh) > 1) return -1; // root不平衡返回-1
        
        return 1 + Math.max(leftHigh, rightHigh);// 平衡,返回树高
	}

猜你喜欢

转载自blog.csdn.net/qq_43778308/article/details/108436400