题目

给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 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 。

思路一:递归记录每个结点的高度+层序遍历检查高度差

不过这样的效率较低,毕竟遍历了两遍。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {public:int getDepth(TreeNode* node){if(node == NULL) return 0;int left=getDepth(node->left);int right=getDepth(node->right);node->val = max(left,right)+1;return max(left,right)+1;}bool isBalanced(TreeNode* root) {getDepth(root);queue<TreeNode*> que;if(root!=NULL) que.push(root);int num=0;while(!que.empty()){//该层结点元素个数 = 该层队列元素int size = que.size();//这里要使用固定大小的size,不能使用que.size(),因为在处理中que.size是不断变化的//将这层元素送入队列中并依次从队首向队尾将元素出队列,每个元素出队列的同时又将其不为空的子结点送入队列for(int i =0;i<size;i++){TreeNode* node = que.front();//将队首元素送入该层结果que.pop();if(node->left && node->right){if(abs(node->left->val - node->right->val)>1){return false;}}if(node->left && !node->right){if(node->left->val>1){return false;}}if(!node->left && node->right){if(node->right->val>1){return false;}}//将左右孩子结点入队列,作为下一层的元素if(node->left) que.push(node->left);if(node->right) que.push(node->right);}}return true;}
};

参考其他思路

概念辨析:
二叉树结点的深度:指从根结点到该结点的最长简单路径边的条数
二叉树结点的高度:指从该结点到叶结点的最长简单路径边的条数
leetcode中强调的深度和高度很明显是按照结点来计算。
深度是从上到下去查,所以需要前序遍历(中左右),而高度只能从下到上去查,所以只能使用后序遍历(左右中)。
根结点的最大深度就是这个根结点的高度。
递归三部曲分析:
1、确定递归参数和返回值
参数:传入的结点指针
返回值:返回传入结点为根结点的树的高度。
如果已经不是二叉平衡树了可以返回-1进行标记。

//-1 表示已经不是平衡二叉树了,否则返回值就是以该节点为更急诶·根结点的树的高度(最大深度)
int getDepth(TreeNode* node)

2、明确终止条件
遇到空结点终止,返回0

if(node ==NULL) return 0 ;

3、明确单层逻辑

1、如果左子树不是平衡二叉树,返回-1
2、如果右子树不是平衡二叉树,返回-1
3、如果左右子树的高度差大于1,返回-1
4、否则,返回结点高度

int leftDepth = getDepth(node->left);
if(leftDepth == -1) return -1;
int rightDepth= getDepth(node->right);
if(rightDepth== -1) return -1;
if(abs(leftDepth - rightDepth)>1) return -1;
else return 1+max(leftDepth,rightDepth);

4、完整递归代码

int getDepth(TreeNode* node)
{if(node ==NULL) return 0 ;int leftDepth = getDepth(node->left);if(leftDepth == -1) return -1;int rightDepth= getDepth(node->right);if(rightDepth== -1) return -1;if(abs(leftDepth - rightDepth)>1) return -1;else return 1+max(leftDepth,rightDepth);
}

5、举例分析

以左侧为例:
4:高度为 1
3:高度为 2
2:高度为3,它的左子树高度为2,右子树高度为0,高度差大于1,所以非平衡树。
下面是我写的错误的代码,原因是对平衡二叉树的理解出现了差错,是两个子树的高度差大于1。
而且考虑到出现一次非平衡状态就直接返回-1,一直返回到原结点,从而减少时间浪费。

错误代码:
int getDepth(TreeNode* node) { if(node == NULL) return 0; int left=getDepth(node->left); int right=getDepth(node->right); if(node->left && node->right) { if(abs(left-right)>1) { return -1; } } if(node->left && !node->right) { if(left>1) { return -1; } } if(!node->left && node->right) { if(right>1) { return -1; } } return max(left,right)+1; }
AC代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {public:int getDepth(TreeNode* node){if(node ==NULL) return 0 ;int leftDepth = getDepth(node->left);if(leftDepth == -1) return -1;int rightDepth= getDepth(node->right);if(rightDepth== -1) return -1;if(abs(leftDepth - rightDepth)>1) return -1;else return 1+max(leftDepth,rightDepth);}bool isBalanced(TreeNode* root) {if(getDepth(root)==-1) return false;return true;}
};

总结

了解了二叉树的深度与高度的差异,求深度适合用前序遍历,求高度适合用后序遍历。

LeetCode 110. 平衡二叉树思考分析相关推荐

  1. LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15

    110. 平衡二叉树 110. Balanced Binary Tree 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点的左右两个子树 ...

  2. leetcode 78. 子集 思考分析

    题目 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 思考分析 画出解空间树. 我们可以发现我们所需要的结果是解空间的所有结点.而我们之前 ...

  3. leetcode 110. 平衡二叉树

    难度:简单 频次:61 题目: 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 . 解题思路:算深度+ ...

  4. 39. Leetcode 110. 平衡二叉树 (二叉树-二叉树性质)

    给定一个二叉树,判断它是否是高度平衡的二叉树.本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 .示例 1:输入:root = [3,9,20,null, ...

  5. [leetcode]110.平衡二叉树

    给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 . 示例 1: 输入:root = [3,9,20,n ...

  6. LeetCode 110平衡二叉树-简单

    给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 . 示例 1: 输入:root = [3,9,20,n ...

  7. leetcode 198. 打家劫舍 思考分析

    目录 1.题目 2.求解思路 3.代码 1.题目 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同 ...

  8. leetcode 46. 全排列 思考分析

    目录 1.题目 2.思考 3.优化 1.题目 给定一个 没有重复 数字的序列,返回其所有可能的全排列. 2.思考 老规矩,先画出给出的例子的解空间树: 观察我们可以发现: 1.深度向下一层深入时,出现 ...

  9. LeetCode 110. 平衡二叉树(二叉树高度)

    1. 题目 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. 示例 1: 给定二叉树 [3,9,20,n ...

最新文章

  1. 3des密钥生成 java_使用keytool生成3DES密钥
  2. squid代理(传统代理)
  3. Andorid SQLite数据库开发基础教程(3)
  4. 理解图像的傅里叶变换(细心分析)
  5. linux shell脚本学习xargs命令使用详解
  6. 一文弄懂神经网络中的反向传播法
  7. 妙!专门看编程书籍类的APP,麻雀虽小,五脏俱全~
  8. 五金手册在线查询_带剔除在线分选秤 零食袋装称重剔除秤-技术文章
  9. php 读取 stl 文件,科学网—[转载]【源码】读取ASCII STL文件的STLReader - 刘春静的博文...
  10. 计算机主机外部的连接端口有何作用,微机原理 课后题 标准答案
  11. python-pygame声音模块的使用
  12. 用自然语言教育人工智能:百度新算法发展出zero-shot学习能力
  13. 微软开源深度学习优化库 DeepSpeed,可训练 1000 亿参数的模型
  14. 长时间工作意味着什么
  15. 多台服务之间共享Session
  16. 14. Nginx 服务器架构
  17. vb6.0连接access数据库
  18. java digester map_Digester学习笔记
  19. 批量修改文件夹名称的一部分字符
  20. oracle阴历转阳历换算,用sql语句实现阳历与农历转换

热门文章

  1. gmat阅读.html,GMAT阅读长难句50句+参考译文.pdf
  2. java httpserver 多个接口_多个Servlet之间数据共享实现方案
  3. mysql不复制数据_windows mysql不停止服务复制数据
  4. html5与css3入门知识点精炼
  5. js笔记(三)ES5、ES5新增的数组的方法、字符串的方法、字符编码、对象的序列化和反序列化、bind
  6. C#中用WebClient.UploadData 方法上载文件数据
  7. django QuerySet对象转换成字典对象
  8. 138.括号序列(区间型DP)
  9. 总线接口与计算机通信
  10. VS2008下QT开发环境搭建