16-20题

16、二叉树的深度

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def maxDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return 0
        else:
            return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))

17、和为S的两个数字
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
排序数组可以在查找时进行优化。

class Solution:
    def FindNumbersWithSum(self, array, tsum):
        rst = [tsum, tsum]
        for i in range(len(array)):
            for j in range(i, len(array)):
                if array[i] + array[j] == tsum:
                    if array[i]*array[j] < rst[0]*rst[1]:
                        rst = [array[i], array[j]]
                        break
                if array[i] + array[j] > tsum:
                    break
        if rst == [tsum, tsum]:
            return False
        return rst

18、顺时针打印矩阵
想了一会没想出来,百度了别人的思路,不断旋转矩阵,自己实现

class Solution:

    def turn(self, matrix):
        '''旋转矩阵'''
        length = len(matrix[0])
        height = len(matrix)
        rst = []
        for i in range(length):
            cur = []
            for j in range(height):
                cur.append(matrix[j][i])
            rst.append(cur)
        return rst[::-1]

    def printMatrix(self, matrix):
        rst = []
        while matrix:
            for i in matrix[0]:
                rst.append(i)
            matrix.pop(0)
            if matrix:
                matrix = self.turn(matrix)
        return rst

19、二叉树的下一个节点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
想了一会,最笨的办法就是写一个中序遍历,存到列表里,然后找该节点的上一个节点。然后上网查了一下,分为三种情况:
1、二叉树是空,返回None
2、该节点存在右子树,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点
3、若不存在右子树,如果该节点是左子节点,返回它的父节点,如果该节点是右子节点,返回父节点的父节点

class Solution:
    def GetNext(self, pNode):
        if not pNode: return None
        if pNode.right:
            pNode = pNode.right
            while pNode.left:
                pNode = pNode.left
            return pNode
        else:
            while pNode.next:
                if pNode == pNode.next.left:
                    return pNode.next
                pNode = pNode.next
        return None

20、判断一棵树是不是左右对称的树
将根节点的右子树整个翻转,再判断跟根节点的左子树是不是相同就可以了

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if not root:
            return True
        
        def reverseTree(root):
            if root:
                reverseTree(root.left)
                reverseTree(root.right)
                root.left, root.right = root.right, root.left
                return root
            else:
                return root
        
        def isSameTree(p, q):
            """
            :type p: TreeNode
            :type q: TreeNode
            :rtype: bool
            """
            if p==None and q==None:
                return True
            if not p or not q:
                return False
            if p.val == q.val:
                return isSameTree(p.left, q.left) and isSameTree(p.right, q.right)
            else:
                return False
                            
        return isSameTree(root.left, reverseTree(root.right))
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 6,020评论 0 13
  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,396评论 0 25
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,509评论 1 31
  • 一直很喜欢@茅夫人的教程, 讲解的很细也很容易明白。 尝试着临摹了两张作品。希望夫人出更多更好的教程 呵呵
    tong_c0fa阅读 325评论 0 0
  • 鲜栗子阅读 195评论 0 1