概述
微信改版,加星标不迷路!
每日一算法-搜索插入位置
作者:阿广
阅读目录
? 题目
? 解析
? 完整代码
1 题目
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过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
。
2 解析
这个题目的意思就是这棵树的每个节点的左子树和右子树的高度相差不能超过1,这种树也叫做平衡二叉树,顺便复习了一下平衡二叉树的概念,以免以后在面试的过程当中对AVL树茫茫然。
那么,我们既然比较的是树的左子树和右子树的高度,我们肯定要写一个函数,专门求一个树的左子树的高度、右子树的高度。此时我们使用递归的方式求当前树的高度。
递归边界:root == NULL 时,也就是把一颗大树分解遍历成NULL时,NULL就是没有树,也没有左子树、右子树,所以NULL应该返回的层次为0。
递归体:即大事化小,小事化了。也就是大事和小事之前是什么关系,也是大事如何一步一步转化为小事的,这个概念比较抽象,第一次接触的可仔细体会体会。
一棵树的高度 = max(左子树的高度 , 右子树的高度) + 1
我们通过上面这个关系,得出下面求一个树的高度的代码。
int countFloor(TreeNode* root){
if(root == NULL){
return 0;
}
else{
return 1 + max(countFloor(root->left),countFloor(root->right));
}
}
我们已经能够求得任意一颗树的高度。因为平衡二叉树的定义是此棵树的任意节点的左子树和右子树的高度相差不能大于1,而不是这棵树的根节点的左子树和右子树的高度相差不能大于1。所以我们还需要遍历这棵树,同样,我们使用递归的方式。
递归边界:如果要是树为空了,这颗树都没有了,左子树、右子树肯定也不存在,所以为NULL的树是平衡二叉树,这是一个边界。经过认真思考,什么时候还得停止?那就是如果遍历到某个节点,经过判断此节点不符合平衡二叉树了,此时直接返回false就ok了,没必要再遍历其他的了,这也就是第二个边界。
递归体:
树为平衡二叉树 = 左子树为平衡二叉树 && 右子树为平衡二叉树
不多说,直接上代码。
3 完整代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isBalanced(TreeNode* root) {
if(root == NULL){
return true;
}
if(abs(countFloor(root->left) - countFloor(root->right))>1){
return false;
}else{
if(isBalanced(root->left) && isBalanced(root->right)){
return true;
}
else{
return false;
}
}
}
int countFloor(TreeNode* root){
if(root == NULL){
return 0;
}
else{
return 1 + max(countFloor(root->left),countFloor(root->right));
}
}
};
4 结果
今日问题
扪心自问一下,自己对算法的复杂度理解程度是怎么样的?
打卡格式:打卡第n天,答:...
为什么打卡?戳下面你就知道了!
猛
戳
这
儿
21/天/养/一/个/好/习/惯
最后
以上就是能干冬日为你收集整理的【每日一算法】平衡二叉树每日一算法-搜索插入位置的全部内容,希望文章能够帮你解决【每日一算法】平衡二叉树每日一算法-搜索插入位置所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复