トピックの説明
説明
与えられた二分木について、高さのバランスが取れているかどうかを判断します。
高さのバランスが取れた二分木: 二分木の各ノードの左右の部分木の高さの差の絶対値が 1 を超えない
問題解決分析:
アイデア: 分割統治アルゴリズム
1. 現在のツリーのルート ノードが平衡二分木の条件を満たさないツリーにあり、false を返し、後で判断しない 2. 現在のツリーのルート ノード
は平衡二分木の条件を満たす木に位置し、左をチェックし、右の部分木が満たされているかどうか、(左と右の部分木は上記の 2 つのステップに引き続き分解されます) 分解され続けるかどうかを判断し
ます現在のツリーのルート ノードがバランス バイナリ ツリーの条件を満たし、左右のサブツリーが一致するかどうかを確認します。
コード:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
struct TreeNode
{
struct TreeNode* left;//节点的左子树
struct TreeNode* right;//节点的右子树
int data;//节点的值
};
int maxDepth(struct TreeNode* root)//注意:root表示节点指针,第一次调用指根节点
{
if (root == NULL)
{
return 0;
}
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(root->right);
return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}
bool isBalancedTree(struct TreeNode* root)//注意:root表示节点指针,第一次调用指根节点
{
//空树满足
if (root == NULL)
return true;
int leftDepth = maxDepth(root->left);//计算左子树深度
int rightDepth = maxDepth(root->right);//计算右子树深度
return abs(leftDepth - rightDepth) < 2
&& isBalancedTree(root->left) && isBalancedTree(root->right);//根(当前节点) 当前节点的左子树 当前节点的右子树
//abs(leftDepth - rightDepth)是检查当前节点是否满足平衡二叉树的要求,
//当满足继续递归左子树和右子树isBalancedTree(root->left) && isBalancedTree(root->right)...
//直到所有的子树都检查了一遍满足要求。
}
//注意:画递归展开图进行理解。
int main()
{
//测试功能
struct TreeNode node1;
struct TreeNode node2;
struct TreeNode node3;
node1.data = 1;
node1.left = &node2;
node1.right = &node3;
node2.data = 2;
node2.left = NULL;
node2.right = NULL;
node3.data = 3;
node3.left = NULL;
node3.right = NULL;
if (isBalancedTree(&node1))
printf("Yes");
else
printf("No");
return 0;
}