Python leetcode tree記錄

池魚小北發表於2019-04-24

本文記錄下在使用刷Leetcode的一些記錄,主要使用變成語言為Python3。

tree的定義:

Python中二叉樹的定義

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
複製程式碼

其他程式語言常見的定義:

Python leetcode tree記錄
記憶體模型:

Python leetcode tree記錄

二叉樹分類

1. 滿二叉樹(Full Binary Tree)

除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點二叉樹,如下圖:

Python leetcode tree記錄

2. 完全二叉樹(Complete Binary Tree)

如果一棵二叉樹有n個結點,深度為k,它的每一個結點都與高度為k的滿二叉樹中編號為1~n的結點一一對應,則稱該樹為完全二叉樹。如下圖:

Python leetcode tree記錄

3. 平衡二叉樹(Balanced Binary Tree)

平衡二叉樹又稱AVL樹,平衡二叉樹是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。如下圖:

Python leetcode tree記錄

4.二叉搜尋樹

二叉查詢樹(Binary Search Tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。 如下圖:

Python leetcode tree記錄

常用演算法操作

通用模板

## 1個root
def slove(root):
    if not root: return xxxx
    if f(root): return yyyy
    l = slove(root.left)
    r = slove(root.right)
    return g(root, l, r)
    
## 2個root    
def slove(p, q):
    if not p and not q: return xxxx
    if f(p, q): reutn yyyy
    c1 = slove(p.child, q.child)
    c2 = slove(p.child, q.child)
    return g(p, q, c1, c2)
複製程式碼

三種遍歷

常見的遍歷有先序遍歷,中序遍歷,後序遍歷。

  • 先序遍歷:根節點->左子樹->右子樹
  • 中序遍歷:左子樹->根節點->右子樹
  • 後序遍歷:左子樹->右子樹->根節點
    Python leetcode tree記錄

先序遍歷

def preorder(root):
    if not root: return 
    print(root.val)
    preorder(root.left)
    preorder(root.right)
複製程式碼

中序遍歷

def inorder(root):
    if not root: return
    inorder(root.left)
    print(root.val)
    inorder(root.right)
複製程式碼

後序遍歷

def postorder(root):
    if not root: return
    postorder(root)
    postorder(root)
    print(root.val)
複製程式碼

建立二叉搜尋樹(BST)

根據一個nums陣列,建立一個BST

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
    
    
def createBST(nums):
    root = None
    for num in nums:
        root = insert(root, num)
    return root    
    
def insert(root, val):
    # 注意 這個二叉樹不是平衡的
    if not root: return TreeNode(val)
    if val <= root.val:
        root.left = insert(root.left, val)
    else:
        root.right = insert(root.right, val)
    return root
    
def inorder(root):
    if not root: return
    inorder(root.left)
    print(root.val)
    inorder(root.right)

def inorder_list(root):
    # 得到中序遍歷的陣列
    res = []
    if not root: return []
    res.append(root.val)
    res.extend(inorder_list(root.left))
    res.extend(inorder_list(root.right))
    return res


if __name__ == "__main__":
    nums = [5,1,4,2,3,6]
    root = createBST(nums)
    inorder(root)
複製程式碼

上面的程式碼執行結果為:

1
2
3
4
5
6
複製程式碼

找到二叉樹的最大值

def maxVal(root):
    max_left = maxVal(root.left)
    max_right = maxVal(root.right)
    return max(root.val, max_left, max_right)

複製程式碼

最大深度

leetcode 104

def maxDeep(root):
    if not root: return 0
    l = maxDeep(root.left)
    r = maxDeep(root.right)
    return max(l, r) + 1
複製程式碼

最小深度

leetcod 111

def minDeep(root):
    if not root: return 0
    if not root.leght and root.right return 1
    l = minDeep(root.left)
    r = minDeep(root.right)
    if not root.left: return 1 + r
    if not root.right: return 1 + l # 1 + left
    return max(l, r) + 1
複製程式碼

BFS

    def bfs(root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        res = []
        from Queue import Queue
        queue = Queue()
        queue.put(root)
        while (not queue.empty()):
            temp = Queue()
            row = []
            while(not queue.empty()):
                node = queue.get()
                if node:
                    row.append(node.val)
                    if node.left:
                        temp.put(node.left)
                    if node.right:    
                        temp.put(node.right)
            queue = temp        
            res.append(row)       
        return res   
複製程式碼

建立一個平衡的BST

class Solution(object):
    def sortedArrayToBST(self, nums):
        """
        :type nums: List[int]
        :rtype: TreeNode
        """
        def sortedBST(nums, start, end):
            if start > end: return None
            mid = (start + end) // 2
            root = TreeNode(nums[mid])
            root.left = sortedBST(nums, start, mid-1)
            root.right = sortedBST(nums, mid+1, end)
            return root
        
        if not nums: return None
        return sortedBST(nums, 0, len(nums)-1)
        
複製程式碼

引用

文章中的視截圖來自youtube 博主花花,感謝博主的視訊。本文的參考的youtube 視訊連結

相關文章