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

重建二叉树

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

例如,给出:

前序遍历 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),因为要存储已有元素。

猜你喜欢

转载自blog.csdn.net/ewfwewef/article/details/108746171
今日推荐