剑指offer37、38、39

37、数字在排序数组中出现的次数

在这里插入图片描述
适用于初学者的解法
方法:暴力循环法。
对数组进行遍历,如果遍历中的数组的值等于k,则计数+1

# -*- coding:utf-8 -*-
class Solution:
    def GetNumberOfK(self, data, k):
        # write code here
        count = 0
        for i in range(len(data)):
            if data[i]==k:
                count+=1
        return count

38、二叉树的深度

在这里插入图片描述
递归的方式:

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def TreeDepth(self, pRoot):
        # write code here
        if pRoot is None:
            return 0
        left = self.TreeDepth(pRoot.left)
        right = self.TreeDepth(pRoot.right)
        depth = max(left,right)+1
        return depth

39、平衡二叉树

在这里插入图片描述
首先搞清楚什么是平衡二叉树:
在平衡二叉树AVL树当中,我们通过“平衡因子”来判断一颗二叉树是否符合高度平衡。
到底什么是AVL树的平衡因子呢?
对于AVL树的每一个结点,平衡因子是它的左子树高度和右子树高度的差值。只有当二叉树所有结点的平衡因子都是-1, 0, 1这三个值的时候,这颗二叉树才是一颗合格的AVL树。
举个例子,下图就是一颗典型的AVL树,每个节点旁边都标注了平衡因子:
在这里插入图片描述
其中结点4的左子树高度是1,右子树不存在,所以该结点的平衡因子是1-0=1。
结点7的左子树不存在,右子树高度是1,所以平衡因子是0-1=-1。
所有的叶子结点,不存在左右子树,所以平衡因子都是0。
如下图就不是平衡二叉树:
在这里插入图片描述
上图原本是一个平衡的AVL树,当插入了新结点1时,父结点2的平衡因子变成了1,祖父结点4的平衡因子变成了2。
此时,结点4的左右子树高度差超过了1,打破了AVL树的平衡。
平衡二叉树定义:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
思路:判断一个数是否为平衡二叉树。平衡二叉树是左子树的高度与右子树的高度差的绝对值小于等于1

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    res=True
    def IsBalanced_Solution(self, pRoot):
        # write code here
        self.TreeDepth(pRoot)
        return self.res
    #这一部分采用38题的判断树的深度的函数。
    def TreeDepth(self, Root):
        # write code here
        if Root is None:
            return 0
        # 判断已经有子树不是平衡二叉树,终止该次递归
        if not self.res:
            return 1
        left = self.TreeDepth(Root.left)+1
        right = self.TreeDepth(Root.right)+1
        if abs(left-right)>1:
            self.res = False
        return max(left,right)
#不要每个节点都去求一次高度,避免重复
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页