LeetCode(110):平衡二叉树

Easy!

题目描述:

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树_每个节点_ 的左右两个子树的高度差的绝对值不超过1。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

13 2 / \ 3 9 20 4 / \ 5 15 7

返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

11 2 / \ 3 2 2 4 / \ 5 3 3 6 / \ 7 4 4

返回 false 。

解题思路:

求二叉树是否平衡,根据题目中的定义,高度平衡二叉树是每一个节点的两个字数的深度差不能超过1,那么我们肯定需要一个求各个点深度的函数,然后对于每个节点的两个子树来进行深度差的比较,时间复杂度为O(NlgN)。

C++解法一:

1 1 class Solution { 2 2 public: 3 3 bool isBalanced(TreeNode *root) { 4 4 if (!root) return true; 5 5 if (abs(getDepth(root->left) - getDepth(root->right)) > 1) return false; 6 6 return isBalanced(root->left) && isBalanced(root->right); 7 7 } 8 8 int getDepth(TreeNode *root) { 9 9 if (!root) return 0; 1010 return 1 + max(getDepth(root->left), getDepth(root->right)); 1111 } 1212 };

上面那个方法正确但不是很高效,因为每一个点都会被上面的点计算深度时访问一次,我们可以进行优化。方法是如果我们发现子树不平衡,则不计算具体的深度,而是直接返回-1。那么优化后的方法为:对于每一个节点,我们通过checkDepth方法递归获得左右子树的深度,如果子树是平衡的,则返回真实的深度,若不平衡,直接返回-1,此方法时间复杂度O(N),空间复杂度O(H)。

C++解法二:

1 1 class Solution { 2 2 public: 3 3 bool isBalanced(TreeNode *root) { 4 4 if (checkDepth(root) == -1) return false; 5 5 else return true; 6 6 } 7 7 int checkDepth(TreeNode *root) { 8 8 if (!root) return 0; 9 9 int left = checkDepth(root->left); 1010 if (left == -1) return -1; 1111 int right = checkDepth(root->right); 1212 if (right == -1) return -1; 1313 int diff = abs(left - right); 1414 if (diff > 1) return -1; 1515 else return 1 + max(left, right); 1616 } 1717 };
点赞
收藏

评论区

加载中...

相关推荐

java——平衡二叉树 AVLTree、AVLMap、AVLSet

平衡二叉树:对于任意一个节点,左子树和右子树的高度差不能超过1packageDate_pacage;importjava.util.ArrayList;publicclassAVLTree<KextendsComparable<K,V{privateclassNod

高级java面试题,附答案+考点

蚂蚁金服一面1.两分钟的自我介绍2.二叉搜索树和平衡二叉树有什么关系,强平衡二叉树(AVL树)和弱平衡二叉树(红黑树)有什么区别3.B树和B树的区别,为什么MySQL要使用B树4.HashMap如何解决Hash冲突5.epoll和poll的区别,及其应用场景6.简述线程池原理,FixedThreadPoo

彻底搞懂系列B-树、B+树、B-树、B*树

(https://blog.csdn.net/chai471793/article/details/99563704)平衡二叉树概念平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构;特点平衡二叉树是采用二分法思维把数据按规则组装成一个树形结构的数据,用这个树形结构的数据减少无关数据的检索,大大

B+树原理以及Java代码实现

最初查找二叉树,由于树的高度会随着有序序列输入而急剧增长,后来出现平衡二叉树,红黑树。B树可以海量数据的快速查询检索,B树主要分为B树(B树),B树,B\树等。B树(B树)M路搜索树,参数M定义节点的分支个数;对于根节点孩子数目为\2,M\,对于其余节点孩子数目为\M/2,M\;每个节点含有关键字属性,至少M/21

Java实现 LeetCode 814 二叉树剪枝 (遍历树)

814\.二叉树剪枝给定二叉树根结点root,此外树的每个结点的值要么是0,要么是1。返回移除了所有不包含1的子树的原二叉树。(节点X的子树为X本身,以及所有X的后代。)示例1:输入:\1,null,0,0,1\输出:\1,null,0,null,1\解释:

PHP数据结构与算法:二叉树

一、定义二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(leftsubtree)和“右子树”(rightsubtree)。二、特性1.在二叉树的第i层上至多有2^(i1)个结点(i0)2.深度为k的二叉树至多有2^k1个结点(k0)3.对于任意一棵二叉树,如果其叶结点数为N0,而