【试题描述】定义一个函数,输入一个链表,判断链表是否存在环路

平衡二叉树,又称AVL树。它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度之差之差的绝对值不超过1。

问题:判断一个二叉排序树是否是平衡二叉树这里是二叉排序树的定义解决方案:根据平衡二叉树的定义,如果任意节点的左右子树的深度相差不超过1,那这棵树就是平衡二叉树。首先编写一个计算二叉树深度的函数,利用递归实现。

解题思路有两种,只遍历一次的方法最优。

重复遍历多次:

在遍历树的每个结点的时候,调用函数TreeDepth得到它的左右子树的深度。如果每个结点的左右子树的深度相差都不超过1,则这是一颗平衡的二叉树。这种方法的缺点是,首先判断根结点是不是平衡的,需要使用TreeDepth获得左右子树的深度,然后还需要继续判断子树是不是平衡的,还是需要使用TreeDepth获得子树的左右子树的深度,这样就导致了大量的重复遍历。

方法一:

class Solution:def IsBalanced_Solution(self, pRoot):return self.TreeDepth(pRoot) != -1def TreeDepth(self, pRoot):# write code hereif not pRoot:return 0left_depth = self.TreeDepth(pRoot.left)if left_depth == -1:return -1right_depth = self.TreeDepth(pRoot.right)if right_depth == -1:return -1if abs(left_depth-right_depth) > 1:return -1return max(1+left_depth, 1+right_depth)class Solution:def IsBalanced_Solution(self, pRoot):# write code hereif pRoot is None:return Truedef TreeDepth(root):if root == None:return 0return 1+max(TreeDepth(root.left), TreeDepth(root.right))if abs(TreeDepth(pRoot.left) - TreeDepth(pRoot.right)) > 1:return Falseelse:return True

只遍历一次:

重复遍历会影响算法的性能,所以很有必要掌握不需要重复遍历的方法。如果我们用后序遍历的方式遍历二叉树的每一个结点,在遍历到一个结点之前我们就已经遍历了它的左右子树。只要在遍历每个结点的时候记录它的深度(某一结点的深度等于它到叶结点的路径的长度),我们就可以一边遍历一边判断每个结点是不是平衡的。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:def IsBalanced_Solution(self, pRoot):# write code here# 思路二:每个节点只遍历一次的解法,后续遍历每个节点depth = [0]# 想通过该递归函数判断该树是不是平衡二叉树,同时还需要获取左右子树的深度,因此还需要传入引用呢return self.IsBalanced(pRoot, depth)   # 第二个参数要传入引用def IsBalanced(self, pRoot, dep):if not pRoot:   # 为None,表示空节点,深度为0,也算平衡二叉树dep[0] = 0return Trueleft, right = [0], [0]if self.IsBalanced(pRoot.left, left) and self.IsBalanced(pRoot.right, right):if abs(left[0]-right[0]) <= 1:dep[0] = left[0]+1 if left[0] > right[0] else right[0] + 1return Truereturn False

[二叉树] 判断一个二叉树是否是平衡(剑指offer39)相关推荐

  1. 二叉树代码 java面试题_《剑指offer》面试题39 二叉树的深度(java)

    摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就 ...

  2. 两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字

    今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字. 题目链接:https://leetcode-cn.com/problems/shu-zu-zhon ...

  3. 判断一个二叉树是不是对称二叉树

    /** * * 思路 :对称二叉树是关于中间轴对称的 * * 从根节点出发,判断根节点是不是对称的,假如根节点对称(左节点的值和右节点的值相等), * 再判断左节点的左节点和右节点的右节点 * 左节点 ...

  4. [二叉树]二叉搜索树转换为双向链表(剑指Offer26)

    [试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...

  5. 链表怎么输出最后一个元素无空格_剑指offer系列----从尾到头打印链表

    从尾到头打印链表 信息卡片 时间:2020-03-23 题目:从尾到头打印链表 tag:list 题目描述 输入一个链表,按链表从尾到头的顺序返回一个 ArrayList. 01 调用 reverse ...

  6. 剑指offer39 平衡二叉树

    一个错误代码 class Solution { public:bool IsBalanced_Solution(TreeNode* pRoot) {return IsBalancedCore(pRoo ...

  7. 剑指offer39:数组中出现次数超过一半的数字

    看到这题,我第一个想法就是,设置一个哈希表,然后统计一下每个数字的出现次数就好了,不过这样需要空间消耗O(n),时间上的复杂度应该是O(n).不过这样能行吗,题目中没有给我数字范围,怎么设置数组大小呢 ...

  8. 【LeetCode】剑指 Offer 32 - II. 从上到下打印二叉树 II

    [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 文章目录 [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 一.层序遍历 BFS 一. ...

  9. 【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构

    本次笔记内容: 3.3.1 先序中序后序遍历 3.3.2 中序非递归遍历 3.3.3 层序遍历 3.3.4 遍历应用例子 小白专场:题意理解及二叉树表示 小白专场:程序框架.建树及同构判别 文章目录 ...

最新文章

  1. 页面动态显示程序执行结果-append
  2. 在ASP.NET中使用Global.asax文件
  3. 【python常用模块】os.path
  4. java基础常问面试题,面试必问
  5. Java基本数据类型总结(转)
  6. Linux基础命令---cat
  7. 学建模从软件开始,8款超级好用的3d建模软件
  8. 正确介绍自己的项目,终于不用害怕面试了
  9. MYSQL5.7多线程复制原理
  10. 一次小米路由器3刷机的翻车记录
  11. FreeCAD新手入门
  12. 【VMD-SSA-LSSVM】基于变分模态分解与麻雀优化Lssvm的负荷预测【多变量】(Matlab代码实现)
  13. 云服务的计算服务中的弹性云服务器(ECS)、裸金属服务器(BMS)以及镜像服务(IMS)的概念和深入理解【CloudService】
  14. DESFire 学习之AUTH
  15. javafx vbox 居中_如何平均分配JavaFX VBox的元素
  16. Python程序退出方式小结
  17. 计算机毕业设计选题推荐springboot+vue教师评教系统 ssm学生评教系统 教学质量评价系统 ssm教学评价系统 教师评价系统java
  18. TCS三步构思——基调、内容、结构
  19. 斜滑块斜导柱计算公式_如何计算模具斜导柱长度
  20. 理解PHP及Zend Engine的线程安全模型(ZTS)

热门文章

  1. 关于 VC 执行顺序
  2. IOS开发之Cocoa编程—— NSUndoManager
  3. CentOS7.5下搭建zabbix3.4监控
  4. [原创] GSM/GPRS 以及CDMA区分以及相关模块选型
  5. asp.net webform 局部发布更新
  6. 数据持久化------Archiving(归档,解档)
  7. Ural_1353. Milliard Vasya's Function(DP)
  8. Adempiere 在Ubuntu下的安装方法(二)
  9. sql 查询性能的问题 有order by 和无order by 速度竟然相差百倍
  10. c语言 Nimm game算法,尼姆博奕(Nimm Game)