• 谷歌面经 Tree Serialization


    http://www.careercup.com/question?id=4868040812396544

    You should transform an structure of multiple tree from machine A to machine B. It is a serialization and deserialization problem, but i failed to solve it well. 

    You could assume the struct is like this:

    struct Node{
        string val;
        vector<Node*> sons;
    }

    and in machine A, you will given the point to root Node, and in machine B,you should return a pointer to root Node.

    class Node:
        def __init__(self, val):
            self.val = val
            self.sons = []
    
    class Solution:
        def __init__(self, root):
            self.sequence = str(root.val)
            cur = [root]
            while cur:
                next = []
                for i in cur:
                    self.sequence += str(len(i.sons))
                    for ii in i.sons:
                        next.append(ii)
                        self.sequence += str(ii.val)
                cur = next
    
        def de_serial(self):
            strs = self.sequence
            # print strs
            idx = 1
            cur = [Node(int(strs[0]))]
            root = cur[0]
            while cur and idx < len(strs):
                next = []
                for i in cur:
                    num = int(strs[idx])
                    # print 'num', num
                    idx += 1  # notice this, idx increment not in while but in for
                    for j in range(num):
                        tmp = Node(int(strs[idx]))
                        # print tmp.val
                        i.sons.append(tmp)
                        next.append(tmp)
                        idx += 1
    
                cur = next
                # print map(lambda x: x.val, next)
            return root
    
    if __name__ == "__main__":
        tree = Node(1)
        two = Node(2)
        three = Node(3)
        four = Node(4)
        five = Node(5)
        six = Node(6)
        seven = Node(7)
        tree.sons = [two, three, four]
        two.sons = [five]
        three.sons = [six, seven]
        a = Solution(tree)
        print a.de_serial()

    先序遍历+中序遍历 唯一确定一棵树, 前提是树是二叉树,树的所有节点值不同

    class Node:
        def __init__(self, val):
            self.val = val
            self.left = None
            self.right = None
    
    class Solution:
        def __init__(self):
            self.pre = []
            self.ino = []
    
        def preorder(self, root, list):
            if not root:  return
            list.append(root.val)
            self.preorder(root.left, list)
            self.preorder(root.right, list)
    
        def inorder(self, root, lists):
            if not root:  return
            self.inorder(root.left, lists)
            lists.append(root.val)
            self.inorder(root.right, lists)
    
        def serialization(self, root):
            self.preorder(root, self.pre)
            self.inorder(root, self.ino)
    
        def de_serial(self):
            return self.de_serialization(self.pre, self.ino)
    
        def de_serialization(self, pre, inorder):
            if not pre:  return None
            root = Node(pre[0])
            i = 0
            while i < len(inorder):
                if pre[0] == inorder[i]:
                    break
                i += 1
    
            root.left = self.de_serialization(pre[1:i+1], inorder[:i])
            root.right = self.de_serialization(pre[i+1:], inorder[i+1:])
            return root
    
    
    if __name__ == "__main__":
        a = Solution()
        tree = Node(0)
        tree.left = Node(1)
        tree.right = Node(2)
        a.serialization(tree)
        root = a.de_serial()
        print root.val, root.left.val, root.right.val
  • 相关阅读:
    js 小程序获取本周七天
    js 时间处理函数 获取今天的前几天和后几天的任意一天
    路由配置
    3 vue-router 的默认hash 改mode:history去除#号 传参
    Eslint 配置及规则说明(报错)
    打开左侧菜单栏
    sublime 对vue的高亮显示
    gitlab 本地建库配置 config
    GIT 安装
    v-html的应用
  • 原文地址:https://www.cnblogs.com/huashiyiqike/p/4698735.html
Copyright © 2020-2023  润新知