LeetCode第110题:平衡二叉树

问题描述

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:
给定二叉树 [3,9,20,null,null,15,7]

3

/
9 20
/
15 7
返回 true 。

示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]

   1
  / \
 2   2
/ \

3 3
/
4 4
返回 false 。

解题思路

很明显的用递归思路可以解决,不过这样的算法效率并不是很高,因为每个节点会被遍历很多次。

递归解法

首先判定二叉树是否平衡还需要一个求节点高度的函数。
再之后就是套平衡二叉树的定义,空树是平衡二叉树,每个节点左右子树高度之差绝对值不超过1的也是平衡二叉树。
当左右子树都平衡时,进一步判断当前节点是否平衡。
当左右子树不都平衡时,显然不是平衡二叉树。

非递归解法

待完善

C++代码

递归解法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isBalanced(TreeNode* root) {
        //空子树是平衡二叉树
        if(root==nullptr)
            return true;
        
        //左右子树全平衡
        //进一步判断当前节点是否平衡
        if(isBalanced(root->left)&&isBalanced(root->right)){
            int leftHeight=height(root->left);
            int rightHeight=height(root->right);
            int factor=abs(leftHeight-rightHeight);
            return factor>-1&&factor<2?true:false;
        }
        
        //左右子树不全平衡
        return false;
        
    }
    
    //计算二叉树的高度
    int height(TreeNode* root){
        //空指针高度为0
        if(root==nullptr)
            return 0;
        
        //否则当前节点高度为
        //左右子树高度最大值+1
        int leftHeight=height(root->left);
        int rightHeight=height(root->right);
        return leftHeight>rightHeight?leftHeight+1:rightHeight+1;
    }
};

非递归解法

待完善

执行结果

递归解法

非递归解法

待完善

posted @ 2018-12-30 17:48  朕蹲厕唱忐忑  阅读(261)  评论(0编辑  收藏  举报