重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出:
前序遍历 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),因为要存储已有元素。