专栏:50多种数据结构彻底征服
专栏:50多种经典图论算法全部掌握
台湾知名宝宝摄影机厂商云云科技的52岁董事长曾某,疑因理念不合,持一把30公分长的刀具,残忍杀害了51岁的梁姓技术总监。
原因是曾某要求团队“三个月内上线社交直播功能”。因为“用户增长放缓,投资方要看数据!”而梁某当场反对:“现在的架构根本撑不起直播,强行上线会崩掉!”
这场冲突的本质,是两种逻辑的生死博弈。梁某的“技术优先”逻辑:先修地基,再盖高楼;曾某的“商业优先”逻辑:先抢市场,边跑边补。
三个月后,直播功能如期上线,结果代价惨重,服务器崩溃,用户投诉激增500%;核心工程师离职三分之一;之后曾某将梁某踢出所有管理群组,还当众嘲讽:“某些人只会写代码,根本不懂商业!”。这哪是职场,简直是战场。
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第110题平衡二叉树。
问题描述
来源:LeetCode第110题
难度:简单
给定一个二叉树,判断它是否是平衡二叉树。平衡二叉树是指该树所有节点的左右子树的高度相差不超过 1。
示例1:
输入:root = [3,9,20,null,null,15,7] 输出:true
示例2:
输入:root = [1,2,2,3,3,null,null,4,4] 输出:false
树中的节点数在范围 [0, 5000] 内
-10^4 <= Node.val <= 10^4
问题分析
这题让判断给定的二叉树是否是平衡二叉树,所谓平衡二叉树就是该二叉树的左右子树高度差的绝对值不能超过 1 ,并且它的任何一颗子树也都是满足这个条件。我们之前讲的就是平衡二叉树。
计算二叉树的高度比较简单,如果是从上往下判断,当根节点平衡之后还需要判断左右两个子树是否平衡,这样树的高度就会出现重复计算,效率比较差。我们可以换一种思路,从下往上判断。
当计算二叉树高度的时候,从下往上如果子树已经出现了不平衡,不要返回二叉树的高度,返回 -1 即可。计算的时候如果子树有返回 -1 的,说明子树已经出现了不平衡,就不需要在计算了,否则就返回二叉树的高度。
JAVA:
public boolean isBalanced(TreeNode root) { return depth(root) != -1; } // 计算二叉树的高度,如果返回了 -1 ,说明出现了不平衡。 private int depth(TreeNode root) { if (root == null) return0; int left = depth(root.left);// 计算左子树的高度 int right = depth(root.right);// 计算右子树的高度 // 如果左右子树只要有一个返回 -1 ,说明子树出现了不平衡, // 否则如果左右子树高度差的绝对值大于 1 ,也说明出现了不平衡。 if (left == -1 || right == -1 || Math.abs(left - right) > 1) return -1; return1 + Math.max(left, right);// 否则返回二叉树的高度 }C++:
public: bool isBalanced(TreeNode *root) { return depth(root) != -1; } // 计算二叉树的高度,如果返回了 -1 ,说明出现了不平衡。 int depth(TreeNode *root) { if (root == nullptr) return0; int left = depth(root->left);// 计算左子树的高度 int right = depth(root->right);// 计算右子树的高度 // 如果左右子树只要有一个返回 -1 ,说明子树出现了不平衡, // 否则如果左右子树高度差的绝对值大于 1 ,也说明出现了不平衡。 if (left == -1 || right == -1 || abs(left - right) > 1) return-1; return1 + max(left, right);// 否则返回二叉树的高度 }笔者简介
博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以 下载我整理的1000多页的PDF算法文档 。
热门跟贴