zoukankan      html  css  js  c++  java
  • 剑指offer-根据前序和中序遍历构建二叉树,年龄排序

    根据前序和中序遍历序列构建二叉树

    思路:

    根据前序序列找到根在中序序列中的位置,从而找到左右子树的中序序列,再根据左右子树的长度,找到它们的前序序列,递归计算。

    代码:

    """
    使用先序遍历和中序遍历的结果重建二叉树
    """
    from collections import deque
    
    
    class TreeNode(object):
        """
        二叉树结点定义
        """
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    
    class Tree(object):
        """
        二叉树
        """
        def __init__(self):
            self.root = None
    
        def bfs(self):
            ret = []
            queue = deque([self.root])
            while queue:
                node = queue.popleft()
                if node:
                    ret.append(node.val)
                    queue.append(node.left)
                    queue.append(node.right)
            return ret
    
        def pre_traversal(self):
            ret = []
    
            def traversal(head):
                if not head:
                    return
                ret.append(head.val)
                traversal(head.left)
                traversal(head.right)
    
            traversal(self.root)
            return ret
    
        def in_traversal(self):
            ret = []
    
            def traversal(head):
                if not head:
                    return
                traversal(head.left)
                ret.append(head.val)
                traversal(head.right)
    
            traversal(self.root)
            return ret
    
        def post_traversal(self):
            ret = []
    
            def traversal(head):
                if not head:
                    return
                traversal(head.left)
                traversal(head.right)
                ret.append(head.val)
    
            traversal(self.root)
            return ret
    
    def construct_tree(preorder=None,inorder=None):
        if not preorder or not inorder:  #空列表不是None ,False,0,'',[],{},()都可以视为假。
            return None
        #print(preorder,inorder)
            #当前根在中序遍历中的下标
        index=inorder.index(preorder[0])
            #左右子树的中序序列
        left=inorder[0:index]
        right=inorder[index+1:]
        root=TreeNode(preorder[0])
            #递归构造
        root.left=construct_tree(preorder[1:len(left)+1],left)
        root.right=construct_tree(preorder[-len(right):],right)
    
        return root
    t = Tree()
    root = construct_tree([1, 2, 4, 7, 3, 5, 6, 8], [4, 7, 2, 1, 5, 3, 8, 6])
    t.root = root
    print (t.bfs())
    print (t.pre_traversal())
    print (t.in_traversal())
    print (t.post_traversal())
    

    年龄排序

    思路:

    可以看到,虽然元素的个数很多,但每个元素的值比较小,建立一个大小为100的数组存放每个年龄的次数。遍历一次就可以知道每个年龄的次数。再输出就行。时间复杂度为O(n)

    代码:

    def sortofage(ages):
        oldestage=100
        timeofage=[0]*100
        for i in range(len(ages)):
            timeofage[ages[i]]+=1
        index=0
        for i in range (oldestage):
            for j in range (timeofage[i]):
                ages[index]=i
                index+=1
        return
    ages=[88,2,43,44,2,91,2,43]
    sortofage(ages)
    print(ages)
    
  • 相关阅读:
    html向servlet传乱码解决办法
    myeclipse破解方法
    django cookie
    django 时间计数
    bzoj1698 / P1606 [USACO07FEB]白银莲花池Lilypad Pond
    bzoj1689 / P1589 [Usaco2005 Open] Muddy roads 泥泞的路
    bzoj1660 / P2866 [USACO06NOV]糟糕的一天Bad Hair Day
    bzoj1657: [Usaco2006 Mar]Mooo 奶牛的歌声
    bzoj1655: [Usaco2006 Jan] Dollar Dayz 奶牛商店
    bzoj1654 / P2863 [USACO06JAN]牛的舞会The Cow Prom
  • 原文地址:https://www.cnblogs.com/void-lambda/p/12330247.html
Copyright © 2011-2022 走看看