美文网首页
Balanced Binary Tree

Balanced Binary Tree

作者: ab409 | 来源:发表于2015-12-10 22:08 被阅读165次

    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

          本文链接:https://www.haomeiwen.com/subject/zndyhttx.html