判断是否是平衡二叉树--c++【做题记录】

【问题描述】

设计算法判断一棵树是否是一棵平衡二叉树。

输入一组数据,按顺序构造出一个二叉排序树,不要平衡化,直接插入数据。判断树是否是平衡二叉树。

【参考算法】

递归算法

bool isBalance(BiNode *bt, int &height) //注意,将height用引用传进来,被调函数可以向主调函数传递计算出来的高度值

递归出口:

若为空,高度就为0,平衡

递归部分:

左递归判断左子树平衡吗?

右递归判断右子树平衡吗?

计算以bt为根的这棵树的高度。是root的左子树、右子树中的较高者加上root本身这个结点(即加1)

假设左子树平衡,右子树平衡,而且左右子树高度差小于等于1,则平衡

【输入输出】

第一行输入数据的个数n

第二行输入n个int型数据

第三行输出是否是平衡二叉树。

【测试数据】

11

38 12 34 56 13 6 98 3 17 40 78

不是二叉平衡树

3

12 11 13

是二叉平衡树

【代码】

#include <iostream>
using namespace std;
struct BiNode
{
    int data;
    BiNode* lchild, * rchild;
};
BiNode* root=NULL;
//求二叉树的深度
int treeHeight(BiNode* bt)
{
    if (bt == NULL)
        return 0;
    else
    {
        int h1 = treeHeight(bt->lchild);
        int h2 = treeHeight(bt->rchild);
        return h1 > h2 ? h1 + 1 : h2 + 1; // 取左右子树中的较高者,并加上根节点
    }
}
// 判断是否为平衡二叉树
bool isBalance(BiNode* bt, int& height) {
    if (bt == NULL) {
        height = 0;
        return true;
    }
    int leftHeight, rightHeight;
    if (isBalance(bt->lchild, leftHeight) && isBalance(bt->rchild, rightHeight)) {
        if (abs(leftHeight - rightHeight) <= 1) {
            height = max(leftHeight, rightHeight) + 1;  //取左右子树的较大者,并加上根节点
            return true;
        }
    }
    return false;

}
// 插入数据
void insertBST(BiNode*& bt, int key)
{
    if (bt == NULL)
    {
        bt = new BiNode;
        bt->data = key;
        bt->lchild = NULL;
        bt->rchild = NULL;
    }
    else
    {
        if (key < bt->data)
            insertBST(bt->lchild, key);
        else if (key > bt->data)
            insertBST(bt->rchild, key);
    }
}

//中序输出二叉树
void Display(BiNode* bt)
{
    if (bt == NULL)
        return;
    else
    {
        Display(bt->lchild);
        cout << bt->data<<" ";
        Display(bt->rchild);

    }
}
int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        int num;
        cin >> num;
        insertBST(root, num);
    }
   /* cout << "inorder\n";
    Display(root);*/
    bool flag = false;
    int height;
    flag = isBalance(root,height);
    if (flag)
    {
        cout << "是二叉平衡树" ;
    }
    else
    {
        cout << "不是二叉平衡树" ;
    }
    return 0;
}

相关推荐

  1. 判断是否平衡--c++【记录

    2024-06-14 04:16:01       7 阅读
  2. 的镜像--c++【记录

    2024-06-14 04:16:01       11 阅读
  3. 判断搜索c++】

    2024-06-14 04:16:01       12 阅读
  4. 第k层结点的个数--c++【记录

    2024-06-14 04:16:01       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-14 04:16:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-14 04:16:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-14 04:16:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-14 04:16:01       20 阅读

热门阅读

  1. 警示:AGI竞赛之未来十年

    2024-06-14 04:16:01       8 阅读
  2. 基于 Vue 3 封装一个 ECharts 图表组件

    2024-06-14 04:16:01       7 阅读
  3. Page的基本使用及其原理

    2024-06-14 04:16:01       7 阅读
  4. 【杂记-浅谈MAC地址】

    2024-06-14 04:16:01       6 阅读
  5. vivado HW_SIO_PLL

    2024-06-14 04:16:01       7 阅读
  6. C++和Python相互调用(1)

    2024-06-14 04:16:01       7 阅读
  7. leetcode hot100 之 编辑距离

    2024-06-14 04:16:01       10 阅读
  8. 115. 素数筛选

    2024-06-14 04:16:01       8 阅读
  9. vue封装全局的防抖节流函数

    2024-06-14 04:16:01       8 阅读
  10. 用Python编写自动发送每日电子邮件报告的脚本

    2024-06-14 04:16:01       6 阅读
  11. SuntoryProgrammingContest2024(AtCoder Beginner Contest 357)

    2024-06-14 04:16:01       8 阅读