剑指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

 

 
posted @ 2020-04-22 09:54  柠檬不酸i  阅读(135)  评论(0编辑  收藏  举报