面試演算法題
阿新 • • 發佈:2020-07-30
"""假設前端同學通過介面向後端傳了天貓的行業資訊,例如: industry_list = [ { "parent_ind" : "女裝", "name" : "連衣裙" }, { "name": "女裝" }, { "parent_ind" : "女裝", "name" : "半身裙" }, { "parent_ind" : "女裝", "name" : "A字裙" }, { "name": "數碼" }, { "parent_ind" : "數碼", "name": "電腦配件" }, { "parent_ind" : "電腦配件", "name": "記憶體" }, ] 為了取用方便,我們希望可以將其轉換為樹狀格式,例如: { "數碼": { "電腦配件": { "記憶體" : {} } }, "女裝" : { "連衣裙": {}, "半身裙": {}, "A字裙": {} } } 實現一個方法完成這個轉換,時間複雜度請控制在O(n)""" def convert_format(data): tree_dict = {} dict1 = {} # 所有key for item_dic in data: name = item_dic.get("name") parent = item_dic.get("parent_ind") son_dic = {name: {}} if not parent: dict1[name] = tree_dict.setdefault(name, {}) else: if tree_dict.get(parent) == None and dict1.get(parent) == None: tree_dict[parent] = son_dic dict1.update(son_dic) dict1.setdefault(parent, {}).update(son_dic) return tree_dict
二叉樹廣度優先遍歷,和其變種“Z“字遍歷
# 定義一個樹節點 class TreeNode: def__init__(self, value=None, left=None, right=None): self.value = value self.left = left # 左子樹 self.right = right # 右子樹 # 例項化一個樹節點 node1 = TreeNode("A", TreeNode("B", TreeNode("D", TreeNode("H")), TreeNode("E", TreeNode("I")) ), TreeNode("C", TreeNode("F"), TreeNode("G") ) ) def levelOrder(tree): if tree is None: return [] q = [] q.append(tree) while len(q) != 0: for i in range(len(q)): r = q.pop(0) if r.left is not None: q.append(r.left) if r.right is not None: q.append(r.right) print(r.value) def leve10der_z(node): # z字遍歷 if node is None: return [] q = [] q.append(node) num = 0 # 控制同層節點遍歷方向 s = '' while len(q) != 0: num += 1 print(num) lenght = len(q) s_item = '' for i in range(lenght): # 控制同層節點遍歷方向 r = q.pop(0) if r.left is not None: # 非空左孩子入隊 q.append(r.left) if r.right is not None: # 非空右孩子入隊 q.append(r.right) s_item = s_item + r.value if num % 2 == 0: s_item = s_item[::-1] s = s + s_item print(s) if __name__ == "__main__": # levelOrder(node1) leve10der_z(node1)