LeetCode :: 1.Balanced Binary Tree [树类题目分析]

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 subtreesof every node never differ by more than 1.

这道题目,我选为树类题目的第一题,难度比较低,AC率也高达30%+。虽然题目比较好AC,但是涉及的知识点还是值得回顾一下的。

其实这个红字定义就是AVL(平衡二叉查找树)的一个条件。这样构造的树,保证了树的深度是logN,现在这题目来判断一下这个条件是否成立。

一般树的题目很容易想到的就是递归了,因为树本身就是递归定义出来的,以二叉树为例,定义如下二叉树是n(n>=0)个有限结点构成的集合。N=0称为空二叉树;n>0的二叉树由一个根结点和两互不相交的,分别称为左子树和右子树的二叉树构成。

解法一、这里最直接的想法是,既然需要每个节点的左右子树的高度差(绝对值)都小于等于1,那么先构建一个求高度的函数height,这里求高度的函数的遍历顺序是后序遍历,然后再从根节点开始,先序遍历(实验室的小伙伴说是后序,这里肯定是先序遍历,因为是先判断了根节点的左右子树高度差)判断每个节点。这样做效率不高,因为重复遍历了两次。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int height(TreeNode *node)
    {
        if (!node)
            return 0;
        int  heiL = height(node -> left);
        int  heiR = height(node -> right);
        return 1 + (heiL > heiR ? heiL : heiR); 
    }
    
    bool isBalanced(TreeNode *root) {
        if (root == NULL)
            return true;
        int diff = height(root -> left) - height(root -> right);
        if (diff > 1 || diff < -1)
            return false;
        return isBalanced(root -> left) && isBalanced(root -> right);
    }
 
};

解法二、 为了避免两次遍历,直接第一次后序遍历,遍历的时候记录下深度,并且判断便可。


/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool checkBalance(TreeNode *node, int &dep)
    {
        if (node == NULL)
        {
            dep = 0;
            return true;
        }
        
        int leftDep, rightDep;
        bool leftBalance = checkBalance(node->left, leftDep);
        bool rightBalance = checkBalance(node->right, rightDep);
        
        dep = max(leftDep, rightDep) + 1;
        
        return leftBalance && rightBalance && (abs(rightDep - leftDep) <= 1);
    }
    
    bool isBalanced(TreeNode *root) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int dep;
        return checkBalance(root, dep);
    }
};

有个需要注意的地方是,这个方法虽然在思路上是时间复杂度更低,但是AC的时间却会更久一些,这点暂时没考虑明白。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值