判断 平衡二叉树

描述:给定一个二叉树,确定它是高度平衡的。对于这个问题,一棵高度平衡的二叉树的定义是:一棵二叉树中每个节点的两个子树的深度相差不会超过1。

例题1:
输入:
tree = {1,2,3}
输出:
true

解释:
如下,是一个平衡的二叉树。
          1  
         / \                
        2   3

例题2:
输入:
tree = {1,#,2,3,4}
输出:
false

解释:
如下,是一个不平衡的二叉树。1的左右子树高度差2
           1  
            \  
            2   
           /  \ 
          3   4

**

递归解法:

**

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param root: The root of binary tree.
     * @return: True if this Binary tree is Balanced, or false.
     */

    // max(left,right)+1  这个需要好好理解,
    // 实际上最后一层的节点(不为空那个)高度为1,倒数第二节点为2,倒数第三节点高度为3,这样回溯,
    // 当然对于一个节点,需要取其左右子树中较大的那个对应的值,然后+1,
    // 因为这个节点比它的左右子树高了一层;我的表达可能不太顺畅;

    //判断当前节点(如根的左子树)的高度,然后和它同一个根节点的另一个节点(如根的右子树)的高度比较;
    // 将较大的那个节点代表的高度+1,回溯作为上一个节点的高度;
    int Height(TreeNode *root)
    {
        if(root==NULL)
        {
            return 0;
        }
        int left=Height(root->left);
        int right=Height(root->right);
        return max(left,right)+1;
    }


    bool isBalanced(TreeNode *root) {
        // write your code here
        if(root==NULL)
        {
            return true;
        }
        //当前节点的左右子树高度;当然要用到Height递归函数才知道这两个子树的高度值;
        int left = Height(root->left);
        int right = Height(root->right);
        // 如果这个节点的左右子树高度值大于1,则不平衡;
        if(abs(left-right)>1)
        {
            return false;
        }
        //递归下去分别判断左子树和右子树,注意是&&,也就是只要存在一个节点不是平衡二叉树就返回false;
        return isBalanced(root->left) && isBalanced(root->right);
    }
};

图片参考:
图1:注意里面是数字代表当前节点的高度,而不是树的值;
在这里插入图片描述
图2:
在这里插入图片描述
图3:
在这里插入图片描述

另一种递归思路:

//判断是否为平衡二叉树
bool isBalanced(TreeNode *root)
{
	return height(root)>=0;
}
//返回最大高度,返回-1表明树不平衡
int height(TreeNode *root)
{
	if(root==NULL)
		return 0;
	int left=height(root->left);
	int right=height(root->right);
	//只要有一个子树节点<0(不平衡),则返回-1;
	if(left<0 || right <0)
	{
		return -1;
	}
	if(left==right)
	{
		return left+1;	//left==right,所以return right+1;也可以
	}
	//以下就是判断两个节点是否平衡,高度差大于1则不平衡,直接返回-1;
	//否则就返回较高的那个子树高度+1的值;毕竟根节点的高度比你这个子树要高一层;
	else if(left>right)
	{
		if(left-right>1)
			return -1;
		return left+1;
	}
	else
	{
		if(right-left>1)
			return -1;
		return right+1;
	}
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值