判断一棵二叉树是否是平衡二叉树

9 篇文章 0 订阅
3 篇文章 0 订阅

输入一棵二叉树,判断该二叉树是否是平衡二叉树。

 

 

首先,平衡二叉树的定义:/*平衡二叉搜索树(Balanced Binary Tree)具有以下性质:

它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树*/

 

所以我想到的是递归的方法,判断左右的高度差。

 

 第一种方法用来判断该二叉树是否为平衡二叉树

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
        val(x), left(NULL), right(NULL) {
        }
};

//方式一:求每个节点的左右子树的高度,判断是不是平衡树,但是这种做法,效率太低,因为需要重复的遍历节点。
int  High(TreeNode *root)
{
    if(root == NULL)
        return 0 ;
    if(root->left == NULL && root->right == NULL)
        return 1;

    int size1 = High(root->left); //左子树的高度
    int size2 = High(root->right); //右子树的高度.

    return (size1>size2 ? size1+1:size2+1);
}

bool IsBalance(TreeNode *root)
{
    if(root == NULL) //空树也是平衡树
        return true;

    int size1 = High(root->left);
    int size2 = High(root->right);

    if(size1 - size2 >1 || size1-size2 < -1)
    {
        return false;
    }

    return IsBalance(root->left) && IsBalance(root->right);
}

第二种方法: 

又有两种写法

1.


public class Solution {
    //后续遍历时,遍历到一个节点,其左右子树已经遍历  依次自底向上判断,每个节点只需要遍历一次
     
    private boolean isBalanced=true;
    public boolean IsBalanced_Solution(TreeNode root) {
         
        getDepth(root);
        return isBalanced;
    }
    public int getDepth(TreeNode root){
        if(root==null)
            return 0;
        int left=getDepth(root.left);
        int right=getDepth(root.right);
         
        if(Math.abs(left-right)>1){
            isBalanced=false;
        }
        return right>left ?right+1:left+1;
         
    }
}

2.

//方法二:利用后序遍历,每一个节点只要访问一次就好了。效率高
bool IsBalance2(TreeNode *root, int& left,int &right)
{
    if(root == NULL)
    {
        size = 0;
        return true;
    }
if(right==0&&left==0) 
return 1;
    
    if(root->left)
    {
        IsBalance2(root->left, leftright);
              left=left>right? left+1:right+1;
    }
    if(root->right)
    {
        IsBalance2(root->right,left, right);
               right=left>right? left+1:right+1;
    }

    if((left -right > 1) || (left -right < -1)) //有一个根节点不是平衡点,整个树就不是平衡树。
        return false;
  
     return true;
}
//depyh表示当前节点最深的高度

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值