33.平衡二叉树
题目内容:
代码及思路:
首先了解平衡二叉树的特点:1.拥有二叉树的特性;2.它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
根据上述特性,我们可以实现题目的要求:
#include<iostream>
using namespace std;
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
};
class Solution
{
public:
void buildTree(TreeNode** root)
{
int temp;
cin >> temp;
if (temp == 0)
{
(*root)->val = 0;
(*root) = nullptr;
return;
}
else
{
(*root)->val = temp;
(*root)->left = new TreeNode;
buildTree(&(*root)->left);
(*root)->right = new TreeNode;
buildTree(&(*root)->right);
}
}
bool IsBalance_Solution(TreeNode* pRoot)
{
if (pRoot == nullptr)
{
return true;
}
int pDepth = 0;
return IsBalance(pRoot, &pDepth);
}
bool IsBalance(TreeNode* pRoot, int* pDepth)
{
//因为要判断左右子树的深度的绝对值不超过1,所以要分别求出左右子树
if (pRoot == nullptr)
{
pDepth = 0; //pDepth为树的深度
return true;
}
int left, right;
if (IsBalance(pRoot->left, &left) && IsBalance(pRoot->right, &right)) //左右子树都存在
{
int diff = left - right;
if (diff <= 1 && diff >= -1)
{
return true;
*pDepth = 1 + (left > right) ? left : right;
}
}
return false;
}
};
void main()
{
Solution* object = new Solution;
TreeNode* root = new TreeNode;
object->buildTree(&root);
bool res = object->IsBalance_Solution(root);
cout << res << endl;
}