Balanced Binary Tree

Balanced Binary Tree


今天是一道题目,来自LeetCode,难度为Easy,Acceptance为32.8%

题目如下


Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

解题思路及代码见阅读原文

回复0000查看更多题目

解题思路


首先,虽然该题为Easy,但是其实还是需要一些技巧的。当然看到二叉树还是应该第一时间想到二叉树的三种遍历方式

  • 该题是Easy的原因是该题可以很容易的想到时间复杂度为O(n^2)的方法。即按照定义,判断根节点左右子树的高度是不是相差1,递归判断左右子树是不是平衡的。代码如下:
class solution {
public:
    int depth (TreeNode *root) {
        if (root == NULL) return 0;
        return max (depth(root -> left), depth (root -> right)) + 1;
    }

    bool isBalanced (TreeNode *root) {
        if (root == NULL) return true;

        int left=depth(root->left);
        int right=depth(root->right);

        return abs(left - right) <= 1 && isBalanced(root->left) && isBalanced(root->right);
    }
};

这种方法被称为top down approach,这样当然是可以的,但是该算法的时间复杂度为O(n^2),其实还有更为简单的方法,可以将时间复杂度将为O(n)

  • 方法如下,这种方法被称为the bottom up的方法,即从底向上的方法,即后序遍历的方法。

这种方法不是显式的从根节点开始计算每个节点的高度,然后比较左右子树的高度差。而是在计算树的高度的同时判断该树是不是平衡的。

即,先判断子树是不是平衡的,若是,则返回子树的高度;若不是,则返回一个非法的数字,如负数。

当一个节点是左右子树有一个不是平衡二叉树则不必继续计算,直接返回false;当左右子树都是平衡时,再比较两个子树的高度是否相差1。若不是,则返回false,否则返回该节点的高度。

最后,我们来看代码。

代码如下


Java版

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isBalanced(TreeNode root) {
        return height(root) != -1;
    }
    private int height(TreeNode node){
        if(null == node)
            return 0;
        int l = height(node.left);
        if(l == -1)
            return -1;
        int r = height(node.right);
        if(r == -1)
            return -1;
        if(l - r > 1 || r - l > 1)
            return -1;
        return 1 + Math.max(l, r);
    }
}

C++版

class solution {
public:
int dfsHeight (TreeNode *root) {
        if (root == NULL) return 0;

        int leftHeight = dfsHeight (root -> left);
        if (leftHeight == -1) return -1;
        int rightHeight = dfsHeight (root -> right);
        if (rightHeight == -1) return -1;

        if (abs(leftHeight - rightHeight) > 1)  return -1;
        return max (leftHeight, rightHeight) + 1;
    }
    bool isBalanced(TreeNode *root) {
        return dfsHeight (root) != -1;
    }
};

你可能感兴趣的:(Balanced Binary Tree)