BFS層次遍歷的模板

層次遍歷模板如下 

from collections import deque
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def levelOrder(root: TreeNode) :
    queue = deque()
    if root:
        queue.append(root)
    while queue:
        ##每次for循環是一層
        for _ in range(0, len(queue)):
            root = queue.popleft(0)
            if root:
                queue.append(root.left)
                queue.append(root.right)
   

LeetCode層次遍歷的題目:

劍指 Offer 32 - II. 從上到下打印二叉樹 II

107. 二叉樹的層次遍歷 II

111. 二叉樹的最小深度

559. N叉樹的最大深度

690. 員工的重要性

993. 二叉樹的堂兄弟節點

面試題 04.03. 特定深度節點鏈表

答案

先運行工具類,可以從字符串裏生成測試用例

from typing import List
import json
from collections import deque
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


def genTreeFromStr(listStr: str):
    list = json.loads(listStr)
    if not list:
        return None
    queue = []
    root = TreeNode(list.pop(0))
    queue.append(root)
    t, i = None, 0
    while queue:
        if(i >= len(list)):
            break
        for _ in range(0, len(queue)):
            t = queue.pop(0)
            if t:
                t.left = None if not list[i] else TreeNode(list[i])
                i += 1
                if(i >= len(list)):
                    break
                t.right = None if not list[i] else TreeNode(list[i])
                i += 1
                queue.append(t.left)
                queue.append(t.right)

    return root


def visitTree(root: TreeNode):
    queue = []
    res = []
    queue.append(root)
    while(len(queue) != 0):
        t = queue.pop(0)
        res.append('null' if(t == None) else t.val)
        if(t):
            queue.append(t.left)
            queue.append(t.right)

    for i in range(len(res)-1, -1, -1):
        if(res[i] == 'null'):
            res.pop(i)
        else:
            break
    print(res)

題目 

'''
SO32
https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/
層次遍歷的話 每次對隊列做一個類似快照的操作標記這次遍歷是一個層次 for _ in range(0, len(queue)):
之後入隊的就是新的一層了
'''
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        res = []
        queue = []
        if root:
            queue.append(root)
        while queue:
            tmp = []
            for _ in range(0, len(queue)):
                root = queue.pop(0)
                if root:
                    tmp.append(root.val)
                    queue.append(root.left)
                    queue.append(root.right)
            if tmp:
                res.append(tmp)
        return res




print(Solution().levelOrder(genTreeFromStr("[3,9,20,null,null,15,7]")))
'''
S107
https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/
SO32 一個題目只是對輸出結果進行了反轉操作
'''
class Solution:
    def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
        res = []
        queue = deque()
        if root:
            queue.append(root)
        while queue:
            tmp = []
            for _ in range(0, len(queue)):
                root = queue.popleft()
                if root:
                    tmp.append(root.val)
                    queue.append(root.left)
                    queue.append(root.right)
            if tmp:
                res.append(tmp)
        res.reverse()
        return res

 

'''
S111
https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/submissions/
做一個層次計數
當一個節點沒有左右子節點時返回該計數
'''
class Solution:
    def minDepth(self, root: TreeNode) -> int:
        queue = deque()
        if root:
            queue.append(root)
        res = 0
        while queue:
            res += 1
            for _ in range(0, len(queue)):
                root = queue.popleft()
                if root:

                    if not root.left and not root.right:
                        return res
                    queue.append(root.left)
                    queue.append(root.right)
        return res
'''
S559
https://leetcode-cn.com/problems/maximum-depth-of-n-ary-tree/
忽略深度優先遍歷
BFS的話思路很簡單,做一個層次遍歷就OK了
利用元組來記錄當前node節點的深度,每次有Children的時候深度+1
dep就是所有深度裏的最大深度
'''

class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children


class Solution:
    def maxDepth(self, root: 'Node') -> int:
        queue = deque()
        if root:
            queue.append((1, root))
        dep = 0

        while len(queue) != 0:
            currentDep, treeNode = queue.popleft()
            if treeNode:
                dep = max(currentDep, dep)
                for t in [] if not treeNode.children else treeNode.children:
                    queue.append((currentDep+1, t))
        return dep

'''
S690
https://leetcode-cn.com/problems/employee-importance/submissions/
其實是一棵多叉樹的層次遍歷
唯一不同的是樹的子兒子不是樹本身 而是id
用一個dic把每個id和對應的樹存起來就解決了
'''




class Employee:
    def __init__(self, id: int, importance: int, subordinates: List[int]):
        self.id = id
        self.importance = importance
        self.subordinates = subordinates


class Solution:
    def getImportance(self, employees: List['Employee'], id: int) -> int:
        dic = {}
        for e in employees:
            dic[e.id] = e
        if id not in dic:
            return 0
        root = dic[id]
        res = 0
        queue = deque()
        queue.append(root)
        while queue:
            for _ in range(0, len(queue)):
                root = queue.popleft()
                if root:
                    res += root.importance
                    if root.subordinates:
                        for sub in root.subordinates:
                            queue.append(sub)
        return res
'''
S933
https://leetcode-cn.com/problems/cousins-in-binary-tree/
層次遍歷 並且保存父節點信息
當某層出現x 或y時直接比對 x y是否都有父節點 並且不相等(沒有父節點表示他不在這一層次)
'''



class Solution:
    def isCousins(self, root: TreeNode, x: int, y: int) -> bool:
        queue = deque()
        if root:
            queue.append((root, None))
        parentX = None
        parentY = None

        while queue:
            for _ in range(0, len(queue)):
                root, parent = queue.popleft()
                if root:
                    if root.val == x:
                        parentX = parent
                    if root.val == y:
                        parentY = parent
                    queue.append((root.left, root.val))
                    queue.append((root.right, root.val))
            if parentX != None or parentY != None:
                if not parentX or not parentY:
                    return False
                return parentX != parentY

        return False



print(Solution().isCousins(genTreeFromStr("[1,2,3,null,4,null,5]"), 5, 4))
print(Solution().isCousins(genTreeFromStr("[1,2,3,4]"), 3, 4))
'''
[面試題 04.03. 特定深度節點鏈表](https://leetcode-cn.com/problems/list-of-depth-lcci/)
'''
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
class Solution:
    def listOfDepth(self, tree: TreeNode) -> List[ListNode]:
        queue = deque()
        res=[]
        if tree:
            queue.append(tree)
        while queue:
            listNode=ListNode(0)
            tmp=listNode
            for _ in range(0,len(queue)):
                root=queue.popleft()
                if root:
                    tmp.next=ListNode(root.val)
                    tmp=tmp.next
                    queue.append(root.left)
                    queue.append(root.right)
            if listNode.next:
                res.append(listNode.next)
        return res

 

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