• 剑指offer分块总结----------树


    1、重建二叉树

    题目描述

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
    例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    class Solution:
        # 返回构造的TreeNode根节点
        def reConstructBinaryTree(self, pre, tin):
            # write code here
            if len(pre)==0:
                return None
            if len(pre)==1:
                return TreeNode(pre[0])
            root=TreeNode(pre[0])
            mid=tin.index(pre[0])
            root.left=self.reConstructBinaryTree(pre[1:mid+1],tin[:mid])
            root.right=self.reConstructBinaryTree(pre[mid+1:],tin[mid+1:])
            return root

    2、二叉树的下一个结点

    题目描述

    给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
    # -*- coding:utf-8 -*-
    # class TreeLinkNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    #         self.next = None
    class Solution:
        def GetNext(self, pNode):
            # write code here
            if not pNode:
                return None
            if not pNode.right and not pNode.left and not pNode.next:
                return None
            if pNode.right:
                res=pNode.right
                while res.left:
                    res=res.left
                return res
            else:
                while pNode.next:
                    if pNode.next.left==pNode:
                        return pNode.next
                    pNode=pNode.next
                return None

    3、对称的二叉树

    题目描述

    请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    class Solution:
        def isSymmetrical(self, pRoot):
            # write code here
            if not pRoot:
                return True
            return self.marrior(pRoot.left,pRoot.right)
        def marrior(self,left,right):
            if not left and not right:#1
                return True
            if not left or not right:#2:1和2的位置千万不能颠倒
                return False
            if left.val==right.val:
                return self.marrior(left.left,right.right) and self.marrior(left.right,right.left)
            else:
                return False

    4、按之字形顺序打印二叉树

    题目描述

    请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    class Solution:
        def Print(self, pRoot):
            # write code here
            if not pRoot:
                return []
            else:
                i=1
                l=[]
                res=[pRoot]
                while res:
                    templist=[]
                    tempres=[]
                    for node in res:
                        tempres.append(node.val)
                        if node.left:
                            templist.append(node.left)
                        if node.right:
                            templist.append(node.right)
                    res=templist
                    if i%2==0:
                        tempres.reverse()
                    i+=1
                    l.append(tempres)
                return l

    5、把二叉树打印成多行

    题目描述

    从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    class Solution:
        # 返回二维列表[[1,2],[4,5]]
        def Print(self, pRoot):
            # write code here
            if not pRoot:
                return []
            l=[]
            res=[pRoot]
            while res:
                templist=[]
                tempres=[]
                for node in res:
                    tempres.append(node.val)
                    if node.left:
                        templist.append(node.left)
                    if node.right:
                        templist.append(node.right)
                res=templist
                l.append(tempres)
            return l

    6、序列化二叉树

    题目描述

    请实现两个函数,分别用来序列化和反序列化二叉树

    二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。
    序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。

    二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
     
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    class Solution:
        def Serialize(self, root):
            # write code here
            if not root:
                return '#'
            return str(root.val) +',' + self.Serialize(root.left) +','+ self.Serialize(root.right)
        def Deserialize(self, s):
            # write code here
            list = s.split(',')
            return self.deserializeTree(list)
    
        def deserializeTree(self, list):
            if len(list)<=0:
                return None
            val = list.pop(0)
            root = None
            if val != '#':
                root = TreeNode(int(val))
                root.left = self.deserializeTree(list)
                root.right = self.deserializeTree(list)
            return root
    7、二叉搜索树的第k个结点

    题目描述

    给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4。
     
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    class Solution:
        # 返回对应节点TreeNode
        def KthNode(self, pRoot, k):
            # write code here
            if not pRoot or k<=0:
                return None
            node_stack=[]
            node=pRoot
            while node or node_stack:
                while node:
                    node_stack.append(node)
                    node=node.left
                node=node_stack.pop()
                k-=1
                if k==0:
                    return node
                node=node.right
            return None

    8、数据流中的中位数

    题目描述

    如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。
    如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
    我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
    class Solution:
        def __init__(self):
            self.arr=[]
        def Insert(self, num):
            # write code here
            self.arr.append(num)
            self.arr.sort()
        def GetMedian(self,arr):
            # write code here
            lens=len(self.arr)
            if lens%2==1:
                return self.arr[lens//2]
            else:
                return (self.arr[lens//2]+self.arr[lens//2-1])/2.0
     
  • 相关阅读:
    近期文章与教程和其他情况说明
    Python从入门到精通--课程目录
    第四天:创建型模式--原型模式
    python api链接数据库
    Delphi 实现简易语音发音(基于TTS方式)
    delphi下运行vbscript脚本
    使用PaxScript为Delphi应用增加对脚本的支持
    delphi与javascript互通
    奇技淫巧之Delphi和JavaScript互通
    在delphi中执行javascript代码
  • 原文地址:https://www.cnblogs.com/pythonbigdata/p/12745503.html
Copyright © 2020-2023  润新知