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閱讀 5,994評論 0 13
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結點至多有m個孩子。 除根結點和葉子結點外,其它每個結點至少有m...
    文檔隨手記閱讀 13,355評論 0 25
  • 樹的概述 樹是一種非常常用的數據結構,樹與前面介紹的線性表,棧,隊列等線性結構不同,樹是一種非線性結構 1.樹的定...
    Jack921閱讀 4,491評論 1 31
  • 一直很喜歡@茅夫人的教程, 講解的很細也很容易明白。 嘗試著臨摹了兩張作品。希望夫人出更多更好的教程 呵呵
    tong_c0fa閱讀 325評論 0 0
  • 鮮栗子閱讀 195評論 0 1