C语言面试题之检查二叉树平衡性

检查二叉树平衡性

实例要求

  • 1、实现一个函数,检查二叉树是否平衡;
  • 2、在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1
c 复制代码
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
    3
   / \
  9  20
    /  \
   15   7
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
      1
     / \
    2   2
   / \
  3   3
 / \
4   4
返回 false 。

实例分析

  • 1、利用递归遍历二叉树的每个节点,计算其左右子树的高度差是否小于等于 1;
  • 2、如果是则继续递归地检查左右子树是否平衡,直到叶子节点或者某个节点的子树不平衡为止;
  • 3、最终返回整棵树是否平衡的结果。

示例代码

c 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


// 计算节点的高度
int height(struct TreeNode* root) {
    if (root == NULL) {
        return 0;
    }
    int left_height = height(root->left);
    int right_height = height(root->right);
    return (left_height > right_height ? left_height : right_height) + 1;
}

// 检查二叉树是否平衡的辅助函数
bool isBalancedUtil(struct TreeNode* root) {
    if (root == NULL) {
        return true;
    }
    int left_height = height(root->left);
    int right_height = height(root->right);
    if (abs(left_height - right_height) <= 1 && isBalancedUtil(root->left) && isBalancedUtil(root->right)) {
        return true;
    }
    return false;
}

// 检查二叉树是否平衡的主函数
bool isBalanced(struct TreeNode* root) {
    return isBalancedUtil(root);
}

代码解释

  • 1、height(struct TreeNode* root): 这个函数计算给定节点 root 的高度(或深度)。它通过递归地计算左子树和右子树的高度,然后返回较大的高度加上 1,表示当前节点的高度;
  • 2、isBalancedUtil(struct TreeNode* root): 这是一个辅助函数,用来检查以 root 为根的子树是否平衡。它通过递归地检查左子树和右子树的高度差是否小于等于 1,并且左子树和右子树是否也是平衡的,来判断当前子树是否平衡;
  • 3、isBalanced(struct TreeNode* root): 这是主函数,用来检查整棵二叉树是否平衡。它调用了 isBalancedUtil 函数来递归地检查每个子树是否平衡,并返回最终的判断结果;

运行结果


相关推荐
绝世唐门三哥2 分钟前
使用Intersection Observer js实现超出视口固定底部按钮
开发语言·前端·javascript
李拾叁的摸鱼日常3 分钟前
Spring 框架中 RequestContextHolder 深度解析
java·架构
Ayu阿予11 分钟前
C++从源文件到可执行文件的过程
开发语言·c++
C++业余爱好者12 分钟前
JVM优化入门指南:JVM垃圾收集器(GC)介绍
java·开发语言·jvm
福尔摩斯张13 分钟前
基于C++的UDP网络通信系统设计与实现
linux·c语言·开发语言·网络·c++·tcp/ip·udp
Trouvaille ~17 分钟前
【Java篇】基石与蓝图::Object 类与抽象类的双重奏
java·开发语言·javase·抽象类·类与对象·基础入门·object类
hkNaruto18 分钟前
【规范】Linux平台C/C++程序版本发布调试规范手册 兼容银河麒麟
linux·c语言·c++
卜锦元19 分钟前
Golang中make()和new()的区别与作用?
开发语言·后端·golang
小光学长21 分钟前
基于ssm的美妆产品推荐系统rah0h134(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring
Light6030 分钟前
破局“数据孤岛”:构建业务、财务、指标三位一体的智能数据模型
java·大数据·开发语言