LeetCode 剑指 Offer——重建二叉树、用两个栈实现队列

这篇博客探讨了如何使用前序遍历和中序遍历的结果重建二叉树,以及如何利用两个栈来模拟队列的操作。在二叉树问题中,通过递归方法,根据前序和中序遍历的特性重构了二叉树结构。而在队列实现上,通过两个栈的交替使用,达到了O(1)的时间复杂度进行插入和删除操作。这两个问题都展示了数据结构和算法在解决实际问题中的应用。
摘要由CSDN通过智能技术生成

重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如,给出:

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

限制:

0 <= 节点个数 <= 5000

代码:

def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
    if len(preorder) == 0:
         return None
     head = TreeNode(preorder[0])
     tmp1 = inorder.index(preorder[0])
     if tmp1 != 0:
         head.left = self.buildTree(preorder[1:tmp1+1], inorder[0:tmp1])
     if tmp1 < len(inorder)-1:
         head.right = self.buildTree(preorder[tmp1+1:], inorder[tmp1+1:])
     return head

二叉树的前序遍历顺序是:根节点、左子树、右子树,每个子树的遍历顺序同样满足前序遍历顺序。

二叉树的中序遍历顺序是:左子树、根节点、右子树,每个子树的遍历顺序同样满足中序遍历顺序。

这里利用了前序和中序遍历的特点,运用递归的方法解决问题。
时间复杂度O(n),空间复杂度O(n)。

用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例1:

输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]

示例2:

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

代码:


class CQueue:

    def __init__(self):
        self.stack1 = []
        self.stack2 = []

    def appendTail(self, value: int) -> None:
        self.stack1.append(value)

    def deleteHead(self) -> int:
        if not self.stack2:
            if not self.stack1:
                return -1
            else:
                while len(self.stack1) > 0:
                    self.stack2.append(self.stack1.pop(-1))
        
        return self.stack2.pop(-1)

本题主要是用两个列表模拟栈来实现一个队列,通过一个栈添加,另一个栈删除实现。插入和删除时间复杂度为O(1),删除看似O(n)但每个元素还是只被操作一次,均摊下来还是O(1)。空间复杂度是O(n),因为要存储已有元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值