leetcode 二叉樹總結python(3)

872. 葉子相似的樹

難度簡單60

請考慮一顆二叉樹上所有的葉子,這些葉子的值按從左到右的順序排列形成一個 葉值序列 。

舉個例子,如上圖所示,給定一顆葉值序列爲 (6, 7, 4, 9, 8) 的樹。

如果有兩顆二叉樹的葉值序列是相同,那麼我們就認爲它們是 葉相似 的。

如果給定的兩個頭結點分別爲 root1 和 root2 的樹是葉相似的,則返回 true;否則返回 false 。

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

class Solution:
    def leafSimilar(self, root1: TreeNode, root2: TreeNode) -> bool:
        num1=[]
        num2=[]
        def leaf(root,nums):
            if root and not root.left and not root.right:
                nums.append(root.val)
            if root.left:
                leaf(root.left,nums)
            if root.right:
                leaf(root.right,nums)
            return nums
        return leaf(root1,num1) == leaf(root2,num2)

617. 合併二叉樹

難度簡單410

給定兩個二叉樹,想象當你將它們中的一個覆蓋到另一個上時,兩個二叉樹的一些節點便會重疊。

你需要將他們合併爲一個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作爲節點合併後的新值,否則不爲 NULL 的節點將直接作爲新二叉樹的節點。

示例 1:

輸入: 
	Tree 1                     Tree 2                  
          1                         2                             
         / \                       / \                            
        3   2                     1   3                        
       /                           \   \                      
      5                             4   7                  
輸出: 
合併後的樹:
	     3
	    / \
	   4   5
	  / \   \ 
	 5   4   7
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
        if t1 is None:
            return t2
        if t2 is None:
            return t1
        root = TreeNode(t1.val+t2.val)
        root.left=self.mergeTrees(t1.left,t2.left)
        root.right=self.mergeTrees(t1.right,t2.right)
        return root

面試題 04.02. 最小高度樹

難度簡單35

給定一個有序整數數組,元素各不相同且按升序排列,編寫一個算法,創建一棵高度最小的二叉搜索樹。

示例:

給定有序數組: [-10,-3,0,5,9],

一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜索樹:

          0 
         / \ 
       -3   9 
       /   / 
     -10  5 
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        if not nums:
            return
        mid = len(nums)//2
        root = TreeNode(nums[mid])
        root.left = self.sortedArrayToBST(nums[:mid])
        root.right = self.sortedArrayToBST(nums[mid+1:])
        return root

965. 單值二叉樹

難度簡單49

如果二叉樹每個節點都具有相同的值,那麼該二叉樹就是單值二叉樹。

只有給定的樹是單值二叉樹時,才返回 true;否則返回 false

 

示例 1:

輸入:[1,1,1,1,1,null,1]
輸出:true

示例 2:

輸入:[2,2,2,5,2]
輸出:false
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isUnivalTree(self, root: TreeNode) -> bool:
        vals=[]
        def dfs(node):
            if node:
                vals.append(node.val)
                dfs(node.left)
                dfs(node.right)
        dfs(root)
        return len(set(vals))==1

劍指 Offer 54. 二叉搜索樹的第k大節點

難度簡單37

給定一棵二叉搜索樹,請找出其中第k大的節點。

 

示例 1:

輸入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
輸出: 4

示例 2:

輸入: root = [5,3,6,2,4,null,null,1], k = 3
       5
      / \
     3   6
    / \
   2   4
  /
 1
輸出: 4
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def kthLargest(self, root: TreeNode, k: int) -> int:
        def dfs(root):
            if not root:
                return 
            dfs(root.right)
            if self.k == 0:
                return 
            self.k-=1
            if self.k == 0:
                self.res=root.val
            dfs(root.left)
        self.k = k
        dfs(root)
        return self.res

993. 二叉樹的堂兄弟節點

難度簡單76

在二叉樹中,根節點位於深度 0 處,每個深度爲 k 的節點的子節點位於深度 k+1 處。

如果二叉樹的兩個節點深度相同,但父節點不同,則它們是一對堂兄弟節點

我們給出了具有唯一值的二叉樹的根節點 root,以及樹中兩個不同節點的值 x 和 y

只有與值 x 和 y 對應的節點是堂兄弟節點時,才返回 true。否則,返回 false

 

示例 1:

輸入:root = [1,2,3,4], x = 4, y = 3
輸出:false

示例 2:

輸入:root = [1,2,3,null,4,null,5], x = 5, y = 4
輸出:true

示例 3:

輸入:root = [1,2,3,null,4], x = 2, y = 3
輸出:false
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isCousins(self, root: TreeNode, x: int, y: int) -> bool:
        parent ={}
        depth ={}
        def dfs(node,par=None):
            if node:
                if par:
                    depth[node.val]=1+depth[par.val]
                else:
                    depth[node.val] = 0
                parent[node.val] = par
                dfs(node.left,node)
                dfs(node.right,node)
        dfs(root)
        return depth[x] == depth[y] and parent[x]!=parent[y]

669. 修剪二叉搜索樹

難度簡單236

給定一個二叉搜索樹,同時給定最小邊界L 和最大邊界 R。通過修剪二叉搜索樹,使得所有節點的值在[L, R]中 (R>=L) 。你可能需要改變樹的根節點,所以結果應當返回修剪好的二叉搜索樹的新的根節點。

示例 1:

輸入: 
    1
   / \
  0   2

  L = 1
  R = 2

輸出: 
    1
      \
       2

示例 2:

輸入: 
    3
   / \
  0   4
   \
    2
   /
  1

  L = 1
  R = 3

輸出: 
      3
     / 
   2   
  /
 1
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def trimBST(self, root: TreeNode, L: int, R: int) -> TreeNode:
        def trim(node):
            if not node:
                return None
            elif node.val>R:
                return trim(node.left)
            elif node.val<L:
                return trim(node.right)
            else:
                node.left = trim(node.left)
                node.right = trim(node.right)
                return node
        return trim(root)

108. 將有序數組轉換爲二叉搜索樹

難度簡單505

將一個按照升序排列的有序數組,轉換爲一棵高度平衡二叉搜索樹。

本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

示例:

給定有序數組: [-10,-3,0,5,9],

一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜索樹:

      0
     / \
   -3   9
   /   /
 -10  5
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        def helper(left,right):
            if left>right:
                return None
            p = (left+right)//2
            root = TreeNode(nums[p])
            root.left = helper(left,p-1)
            root.right = helper(p+1,right)
            return root
        return helper(0,len(nums)-1)

559. N叉樹的最大深度

難度簡單96

給定一個 N 叉樹,找到其最大深度。

最大深度是指從根節點到最遠葉子節點的最長路徑上的節點總數。

例如,給定一個 3叉樹 :

 

 

我們應返回其最大深度,3。

"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution:
    def maxDepth(self, root: 'Node') -> int:
        if not root:
            return 0
        elif root.children ==[]:
            return 1
        else :
            height =[self.maxDepth(c) for c in root.children]
            return max(height)+1

226. 翻轉二叉樹

難度簡單483

翻轉一棵二叉樹。

示例:

輸入:

     4
   /   \
  2     7
 / \   / \
1   3 6   9

輸出:

     4
   /   \
  7     2
 / \   / \
9   6 3   1
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def invertTree(self, root: TreeNode) -> TreeNode:
        if not root:
            return None
        root.left,root.right = root.right ,root.left
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章