跟着姚桑学算法-平衡二叉树

简介: 剑指offer算法

题. 平衡二叉树

输入一棵二叉树的根结点,判断该树是不是平衡二叉树。

如果某二叉树中任意结点的左右子树的深度相差不超过 1,那么它就是一棵平衡二叉树。

注意:

规定空树也是一棵平衡二叉树。

数据范围
树中节点数量 [0,500]。

样例

输入:二叉树[5,7,11,null,null,12,9,null,null,null,null]如下所示,
    5
   / \
  7  11
    /  \
   12   9

输出:true

【题解】--- 枚举

首先我们要知道判断 平衡二叉树 的依据:

  1. 空树平衡二叉树
  2. |平衡因子|<=1

平衡因子=一个节点的左子树高度-右子树高度

这道题的做法也就是将求深度的代码稍作修改,不重复求深度。

也可以直接用高度h,平衡二叉树递归满足:

  1. 左右子树是平衡的
  2. 左子树-右子树高度的绝对值<2

复杂度分析:

时间复杂度因为只遍历结点一次,所以最坏情形为O(n)

C++代码实现:

class Solution {
public:
    bool isBalanced(TreeNode* root) {
        /*
        unit test
        root is nil
        root not nil, left is nil, right is nil
        root not nil, left not nil, right nil.
        */
        int height=dfs(root);
        if(height>=0) return true;
        else return false;
    }

    // 当非平衡时,return -1; 平衡时,return high;
    // 首先判断左子树平衡与否,再判断右子树平衡与否,在判断整棵树平衡与否;
    int dfs(TreeNode *root){
        if(!root) return 0;
        int left=dfs(root->left); 
        if(left<0) return -1;
        int right=dfs(root->right);
        if(right<0) return -1;
        if(abs(left-right)>1) return -1;
        return max(left,right)+1;
    }
};

// 方法二:
/**
 * 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) return true;
        return isBalanced(root->left)&&isBalanced(root->right)&&abs(h(root->left)-h(root->right))<2;
    }
    int h(TreeNode *bt)
    {
        if(!bt)return 0;
        return max(h(bt->left),h(bt->right))+1;
    }
};
目录
相关文章
|
6月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
55 0
|
1月前
|
存储 算法 数据管理
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
这篇文章通过需求分析、代码实现和测试验证,详细介绍了二叉排序树的创建、遍历和删除操作,以及二叉平衡树(AVL)的自平衡特性和单旋转操作,旨在提高树结构在数据管理中的效率和性能。
30 0
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
|
5月前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
5月前
|
算法
数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)
数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)
51 0
|
6月前
|
算法 前端开发
前端算法-平衡二叉树
前端算法-平衡二叉树
|
算法 Python
Python算法——平衡二叉树(AVL)
Python算法——平衡二叉树(AVL)
193 2
|
算法
代码随想录算法训练营第十七天 | LeetCode 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和
代码随想录算法训练营第十七天 | LeetCode 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和
42 0
算法训练Day18|● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和
算法训练Day18|● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和
|
算法 Java
Java数据结构与算法分析(九)AVL树(平衡二叉树)
AVL(Adelson-Velskii 和 Landis)树是带有平衡条件的二叉查找树,又叫做平衡二叉树。在AVL树中任何节点的两个子树高度差最多为1,所以它又被称为高度平衡树。
110 0
|
算法 JavaScript Serverless
日拱算法之判断平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。