【每日一算法】平衡二叉树

微信改版,加星标不迷路!

640?wx_fmt=png

每日一算法-搜索插入位置

作者:阿广


阅读目录

? 题目

? 解析

? 完整代码


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 结果

640?wx_fmt=png


640?

今日问题  

640?

640?wx_fmt=png

扪心自问一下,自己对算法的复杂度理解程度是怎么样的?


打卡格式:打卡第n天,答:...


为什么打卡?戳下面你就知道了!



21/天/养/一/个/好/习/惯


640?wx_fmt=png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值