剑指offer--树

题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

# -*- coding:utf-8 -*-
# class TreeNode:
#     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 not pre:
            return None
        elif len(pre) == 1:
            return TreeNode(pre[0])
        else:
            root = TreeNode(pre[0])
            root.left = self.reConstructBinaryTree(pre[1:tin.index(pre[0])+1], tin[:tin.index(pre[0])])
            root.right = self.reConstructBinaryTree(pre[tin.index(pre[0])+1:], tin[tin.index(pre[0])+1:])
        return root

题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

# -*- 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 pNode.right:
            pNode = pNode.right
            while pNode.left:
                pNode = pNode.left
            return pNode
        while pNode.next:
            p = pNode.next
            if pNode == p.left:
                return p
            pNode = p
        return None

题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

# -*- coding:utf-8 -*-
# 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.comTree(pRoot.left, pRoot.right)
    
    def comTree(self, left, right):
        if not left and not right:
            return True
        if not left or not right:
            return False
        if left.val == right.val:
            return self.comTree(left.left, right.right) and self.comTree(left.right, right.left)
        else:
            return False

题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

# -*- coding:utf-8 -*-
# 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 []
        res = []
        stack = [pRoot]
        left_right = False
        while stack:
            tmp = []
            tmpres = []
            for i in stack:
                tmpres.append(i.val)
                if i.left:
                    tmp.append(i.left)
                if i.right:
                    tmp.append(i.right)
            if left_right:
                tmpres = tmpres[::-1]
            if tmpres:
                res.append(tmpres)
            left_right = not left_right
            stack = tmp
        return res

题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

# -*- coding:utf-8 -*-
# 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 []
        res = []
        current = [pRoot]
        while current:
            tmp = []
            restmp = []
            for i in current:
                restmp.append(i.val)
                if i.left:
                    tmp.append(i.left)
                if i.right:
                    tmp.append(i.right)
            current = tmp
            res.append(restmp)
        return res

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

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

二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
import re
class Solution:
    
    def __init__(self):
        self.flag = -1
    
    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
        self.flag += 1
        L = re.split(',|!', s)
        
        if self.flag > len(L):
            return None
        root = None
        
        while L[self.flag] != '#':
            root = TreeNode(int(L[self.flag]))
            root.left = self.Deserialize(s)
            root.right = self.Deserialize(s)
        return root

题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

# -*- coding:utf-8 -*-
# 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 k < 0:
            return None
        count = 0
        tmp = []
        while tmp or pRoot:
            if pRoot:
                tmp.append(pRoot)
                pRoot = pRoot.left
            else:
                pRoot = tmp.pop()
                count += 1
                if count == k:
                    return pRoot
                pRoot = pRoot.right
        return None

题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

# -*- coding:utf-8 -*-
import heapq
class Solution:

    def __init__(self):
        self.count = 0
        self.minheap = []
        self.maxheap = []

    def Insert(self, num):
        # write code here
        self.count += 1
        if self.count&1 :
            heapq.heappush(self.minheap, num)
            min_heap_top = heapq.heappop(self.minheap)
            heapq.heappush(self.maxheap, -min_heap_top)
        else:
            heapq.heappush(self.maxheap, -num)
            max_heap_top = heapq.heappop(self.maxheap)
            heapq.heappush(self.minheap, -max_heap_top)
            
    def GetMedian(self, s):
        # write code here
        if self.count&1:
            return -self.maxheap[0]
        else:
            return (self.minheap[0] - self.maxheap[0])/2.0
发布了9 篇原创文章 · 获赞 0 · 访问量 754

猜你喜欢

转载自blog.csdn.net/weixin_42707571/article/details/105257066