判断二叉树是否为平衡二叉树

Posted xuan01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断二叉树是否为平衡二叉树相关的知识,希望对你有一定的参考价值。

问题:判断二叉树是否为平衡二叉树面试题55 - II. 平衡二叉树(从底至顶、从顶至底,清晰图解) - 平衡二叉树 - 力扣(LeetCode)

方法一:后序遍历+剪枝,自下而上

后续遍历节点,递归向上返回子树的深度,同时判断当前子树是否为平衡二叉树,若不是则直接返回,称为剪枝。

recur(TreeNode* node)函数:当前子树的深度= 左右子树的深度最大值+1;当前子树左右子树深度差 >1则直接返回,不是平衡二叉树

时间复杂度:O(N);空间复杂度:O(N).

/**
 * 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) 
        return recur(root) != -1;
    
private:
    int recur(TreeNode* node)
        if(node == nullptr) return 0;
        int left = recur(node->left);
        if(left == -1) return -1;//剪枝
        int right = recur(node->right);
        if(right == -1) return -1;
        return abs(left-right)<= 1 ? max(left,right)+1 : -1;
    
;

方法二:前序遍历+深度,自顶向下

此方法会造成大量重复计算;自顶向下判断每个节点的深度差<=1,每个节点至少一次被访问;

判断当前子树是否为平衡二叉树;判断当前子树的左子树是否是平衡二叉树;判断当前子树的右子树是否是平衡二叉树;

Depth(TreeNode* node)计算当前节点的深度,返回左右子树深度的最大值+1;

时间复杂度:O(N logN);空间复杂度:O(N);

/**
 * 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;
        return abs(Depth(root->left)-Depth(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right);
    
private:
    int Depth(TreeNode* node)
        if(node == nullptr) return 0;
        return max(Depth(node->left),Depth(node->right))+1;
    
;

 

以上是关于判断二叉树是否为平衡二叉树的主要内容,如果未能解决你的问题,请参考以下文章

python判断二叉树是否为平衡二叉树

Day54: 判断是否为平衡二叉树

判断是否为平衡二叉树

"Coding Interview Guide" -- 判断二叉树是否为平衡二叉树

《剑指offer》:[39-1]判断是否为平衡二叉树

平衡二叉树判断