当前位置: 首页 > news >正文

21 - 二叉树(三)

文章目录

    • 1. 二叉树的镜像
    • 2. 判断是不是完全二叉树
    • 3. 完全二叉树的节点个数
    • 4. 判断是不是平衡二叉树

1. 二叉树的镜像

在这里插入图片描述

#include <ctime>
class Solution {public:TreeNode* Mirror(TreeNode* pRoot) {// write code hereif (pRoot == nullptr) return pRoot;//这里记得要记得保存pRoot->left,否则就会被pRoot->right覆盖TreeNode* node = pRoot->left;pRoot->left = Mirror(pRoot->right);pRoot->right = Mirror(node);return pRoot;}
};

2. 判断是不是完全二叉树

在这里插入图片描述

  • 先判断空树一定是完全二叉树。
  • 初始化一个队列辅助层次遍历,将根节点加入。
  • 逐渐从队列中弹出元素访问节点,如果遇到某个节点为空,进行标记,代表到了完全二叉树的最下层,若是后续还有访问,则说明提前出现了叶子节点,不符合完全二叉树的性质。
  • 否则,继续加入左右子节点进入队列排队,等待访问。
/*** struct TreeNode {*  int val;*  struct TreeNode *left;*  struct TreeNode *right;*  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/
class Solution {public:bool isCompleteTree(TreeNode* root) {// write code hereif (root == nullptr) return true;queue<TreeNode*> que;que.push(root);bool flag = false;while (!que.empty()) {int size = que.size();for (int i = 0; i < size; ++i) {TreeNode* node = que.front();que.pop();if(node == nullptr){flag = true;}else{if(flag) return false;que.push(node->left);que.push(node->right);}}}return true;}
};

3. 完全二叉树的节点个数

在这里插入图片描述
在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。

完全二叉树只有两种情况

  • 情况一:就是满二叉树,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。
  • 情况二:最后一层叶子节点没有满,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。
class Solution {
public:int countNodes(TreeNode* root) {if(root == nullptr){return 0;}TreeNode* left = root->left;TreeNode* right = root->right;int leftd = 0;int rightd = 0;while(left != nullptr){left = left->left;leftd++;}while(right != nullptr){right = right->right;rightd++;}if(leftd == rightd){return (2 << leftd) - 1;}return countNodes(root->left) + countNodes(root->right) + 1;}
};

4. 判断是不是平衡二叉树

在这里插入图片描述
分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

class Solution {
public:bool IsBalanced_Solution(TreeNode* pRoot) {if(pRoot == nullptr) return true;int result = getHigh(pRoot);return result == -1 ? false : true;}
private:int getHigh(TreeNode* root){if(root == nullptr) return 0;int left = getHigh(root->left);if(left == -1) return -1;int right = getHigh(root->right);if(right == -1) return -1;return abs(left - right) > 1 ? -1 : 1 + max(left, right);}
};
http://www.lryc.cn/news/43774.html

相关文章:

  • 【A-Star算法】【学习笔记】【附GitHub一个示例代码】
  • 纽扣电池澳大利亚认证的更新要求
  • 零代码零距离,明道云开放日北京站圆满结束
  • 第五章Vue路由
  • Git常用指令
  • Java每日一练(20230329)
  • 【面试题】JS的一些优雅写法 reduce和map
  • 【蓝桥杯真题】包子凑数(裴蜀定理、动态规划、背包问题)
  • 一种免费将PDF转word的方式
  • MyBatis-面试题
  • jQuery一些问题和ajax操作
  • Pytorch构建自己的数据集
  • 信息论小课堂:纠错码(海明码在信息传输编码时,通过巧妙的信道编码保证有了错误能够自动纠错。)
  • MySQL执行计划(explain)
  • 思必驰回复第二轮审核问询,如何与科大讯飞、阿里巴巴“虎口夺食”?
  • 基于Spring、SpringMVC、MyBatis的汽车租赁系统设计
  • 读《刻意练习》后感,与原文好句摘抄
  • 华为OD机试用java实现 -【选座位】
  • 国产蓝牙耳机怎么挑选?口碑最好的国产蓝牙耳机
  • seaborn从入门到精通03-绘图功能实现02-分类绘图Categorical plots
  • ❤️独特的算法❤️:一文解决编辑距离问题
  • 三次样条样条:Bézier样条和Hermite样条
  • Redis面试题 (2023最新版)
  • 基于springboot实现家乡特色食品景点推荐系统【源码+论文】分享
  • Spring MVC 启动之 HandlerMapping
  • 基于YOLOv5的停车位检测系统(清新UI+深度学习+训练数据集)
  • 【Linux系统编程】5.vim基本操作命令
  • 主流机器学习平台调研与对比分析
  • 作业帮基于明道云开展的硬件业务数字化建设
  • 位图及布隆过滤器的模拟实现与面试题