每日一练(28):平衡二叉树

简介: 输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过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 。


限制:


0 <= 树的结点个数 <= 10000


来源:力扣(LeetCode)


链接:https://leetcode-cn.com/probl...


方法一:后序遍历(DFS)


dfs计算思路:


  • 对于空结点,深度为0
  • 当前深度是左右子树深度的最大值+1, 有效情况直接返回深度
  • 一旦发现左右子树的深度差异超过1,则认为无效,返回-1
  • 一旦发现返回是-1, 直接返回-1


bool isBalanced(TreeNode* root) {
    return (dfs(root) != -1);
}
int dfs(TreeNode* node) {
    if (node == nullptr) {
        return 0;
    }
    int left = dfs(node->left);
    if (left == -1) {
        return -1;
    }
    int right = dfs(node->right);
    if (right == -1) {
        return -1;
    }
    return abs(left - right) > 1 ? -1 : max(left, right) + 1;//当前深度是左右子树深度的最大值+1, 有效情况直接返回深度
}


方法二:前序遍历


对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差是否不超过 11,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。这

是一个自顶向下的递归的过程


int height(TreeNode* root) {
    if (root == nullptr) {
        return 0;
    }
    return max(height(root->left), height(root->right)) + 1;
}
bool isBalanced(TreeNode* root) {
    if (root == nullptr) {
        return true;
    }
    return abs(height(root->left) - height(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right);
}


目录
相关文章
|
9月前
|
算法
刷题专栏(八):平衡二叉树
刷题专栏(八):平衡二叉树
60 0
|
4月前
|
Java
手撸二叉树——AVL平衡二叉树
本文介绍了AVL平衡二叉树的基本概念和实现方法。首先回顾了二叉查找树在插入节点后的不平衡问题,然后详细讲解了四种旋转操作:左左单旋转、右右单旋转、左右双旋转和右左双旋转,以确保树的平衡。文章还提供了Java代码实现,包括节点插入、删除和平衡调整的具体方法。通过这些操作,AVL树能够保持较低的高度,从而提高查询性能。
55 0
代码随想录刷题|二叉树的理论基础、 二叉树的遍历 LeetCode 144、145、94、120(上)
代码随想录刷题|二叉树的理论基础、 二叉树的遍历 LeetCode 144、145、94、120
代码随想录刷题|二叉树的理论基础、 二叉树的遍历 LeetCode 144、145、94、120(下)
代码随想录刷题|二叉树的理论基础、 二叉树的遍历 LeetCode 144、145、94、120
代码随想录刷题|二叉树的理论基础、 二叉树的遍历 LeetCode 144、145、94、120(下)
|
存储
每日一练(13):反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
80 0
每日一练(26):二叉搜索树的第k大节点
给定一棵二叉搜索树,请找出其中第 k 大的节点的值。
122 0
|
算法 API
【数据结构与算法】二叉树(下)
【数据结构与算法】二叉树(下)
【数据结构与算法】二叉树(下)
|
存储 算法 Java
数据结构与算法之二叉树大全
任何一个节点的子节点数量不超过 2,那就是二叉树;二叉树的子节点分为左节点和右节点,不能颠倒位置
146 0
数据结构与算法之二叉树大全

热门文章

最新文章