【LeetCode刷题记录】简单篇-110-平衡二叉树

【题目描述】

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


【测试用例】

示例1:

        输入:root = [3,9,20,null,null,15,7]

        输出:true

示例2

        输入:root = [1,2,2,3,3,null,null,4,4]

        输出:false

示例3

        输入:root = [ ]

        输出:true


【思路分析】

左右子树的深度之差不超过1则称该树为平衡二叉树。在这道题中,首先,空树一定是平衡二叉树,单独处理。然后,对于非空树,需要判断其左右子树的深度,这里仍然使用递归的思想,用一个countHigh函数来计算深度,通过传入root->left和root->right来分别计算左右子树的深度left和right,如果left和right等于-1,则表示树失衡,返回-1,否则返回left和right中较大的一个值+1(+1是因为这里返回是返回给上层递归,加的1表示上一层)。


【参考代码】

C实现

#include <stdio.h>

//easy-110-平衡二叉树
int count(struct TreeNode* root);
bool isBalanced(struct TreeNode* root);

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
}; 

int countHigh(struct TreeNode* root){
	if(NULL == root){
		return 0;
	}
	int left = countHigh(root->left);
	if(left == -1){
		return -1;
	}
	int right = countHigh(root->right);
	if(right == -1){
		return -1;
	}
	if(abs(left - right) > 1){
		return -1;
	}else{
		return left > right ? left + 1 : right + 1;
	}
}

bool isBalanced(struct TreeNode* root) {
    return countHigh(root)==-1 ? false : true;
}

C++实现

#include <iostream>
using namespace std;

//easy-110-平衡二叉树
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

class Solution {
public:
	int countHigh(TreeNode* root);
    bool isBalanced(TreeNode* root);
};

int Solution::countHigh(TreeNode* root){
	if(NULL == root){
		return 0;
	}
	int left = countHigh(root->left);
	if(left == -1){
		return -1;
	}
	int right = countHigh(root->right);
	if(right == -1){
		return -1;
	}
	if(abs(left - right) > 1){
		return -1;
	}else{
		return max(left, right) + 1;
	}
}

bool Solution::isBalanced(TreeNode* root){
	return countHigh(root)==-1 ? false : true;
} 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值