zoukankan      html  css  js  c++  java
  • 面试算法题

    """假设前端同学通过接口向后端传了天猫的行业信息,例如:
    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)
  • 相关阅读:
    2.3 节的练习
    2.2 节的练习--Compiler principles, technologys, &tools
    web测试点整理(二) -- 输入框
    web测试点整理 -- 注册/登录
    产品测试的思路
    C语言学习--静态链接库和动态链接库
    C语言学习(四)--操作符
    C语言学习(三)--语句
    C语言学习(二)--数据类型
    C语言学习(一)--基本概念
  • 原文地址:https://www.cnblogs.com/zwq-/p/13404953.html
Copyright © 2011-2022 走看看