栈及其应用(二叉树遍历)
495. 实现栈
实现一个栈,可以使用除了栈之外的数据结构
Example
例1:
输入:
push(1)
pop()
push(2)
top() // return 2
pop()
isEmpty() // return true
push(3)
isEmpty() // return false
例2:
输入:
isEmpty()
1 class Stack: 2 def __init__(self): 3 self.array = [] 4 """ 5 @param: x: An integer 6 @return: nothing 7 """ 8 def push(self, x): 9 # write your code here 10 self.array.append(x) 11 12 """ 13 @return: nothing 14 """ 15 def pop(self): 16 # write your code here 17 self.array.pop() 18 19 """ 20 @return: An integer 21 """ 22 def top(self): 23 # write your code here 24 return self.array[-1] 25 26 """ 27 @return: True if the stack is empty 28 """ 29 def isEmpty(self): 30 # write your code here 31 return len(self.array) == 0
144. 二叉树的前序遍历
给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
递归:
1 # Definition for a binary tree node. 2 # class TreeNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution: 9 def preorderTraversal(self, root: TreeNode) -> List[int]: 10 if not root: 11 return list() 12 13 res = list() 14 15 res.append(root.val) 16 res += self.preorderTraversal(root.left) 17 res += self.preorderTraversal(root.right) 18 19 return res 20 21
非递归:
1 # Definition for a binary tree node. 2 # class TreeNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution: 9 def preorderTraversal(self, root: TreeNode) -> List[int]: 10 if not root: 11 return list() 12 13 node = root 14 stack = list() 15 res = list() 16 17 while stack or node: 18 if node: 19 res.append(node.val) 20 stack.append(node) 21 node = node.left 22 else: 23 node = stack.pop() 24 node = node.right 25 26 return res 27 28
94. 二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2]
递归:
1 # Definition for a binary tree node. 2 # class TreeNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution: 9 def inorderTraversal(self, root: TreeNode) -> List[int]: 10 if not root: 11 return list() 12 13 res = self.inorderTraversal(root.left) 14 res += [root.val] 15 res+= self.inorderTraversal(root.right) 16 17 return res
非递归:
1 # Definition for a binary tree node. 2 # class TreeNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution: 9 def inorderTraversal(self, root: TreeNode) -> List[int]: 10 if not root: 11 return list() 12 13 stack = list() 14 node = root 15 res = list() 16 17 while stack or node: 18 if node: 19 stack.append(node) 20 node = node.left 21 22 else: 23 node = stack.pop() 24 res.append(node.val) 25 node = node.right 26 27 return res
145. 二叉树的后序遍历
给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
递归:
1 # Definition for a binary tree node. 2 # class TreeNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution: 9 def postorderTraversal(self, root: TreeNode) -> List[int]: 10 if not root: 11 return list() 12 13 res = self.postorderTraversal(root.left) 14 res += self.postorderTraversal(root.right) 15 res+= [root.val] 16 17 return res
非递归:
1 # Definition for a binary tree node. 2 # class TreeNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution: 9 def postorderTraversal(self, root: TreeNode) -> List[int]: 10 if not root: 11 return list() 12 13 stack = [root] 14 res = list() 15 16 while stack: 17 node = stack.pop() 18 res.append(node.val) 19 if node.left: 20 stack.append(node.left) 21 if node.right: 22 stack.append(node.right) 23 24 return res[::-1]
71. 简化路径
以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。
在 Unix 风格的文件系统中,一个点(.
)表示当前目录本身;此外,两个点 (..
) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径
请注意,返回的规范路径必须始终以斜杠 /
开头,并且两个目录名之间必须只有一个斜杠 /
。最后一个目录名(如果存在)不能以 /
结尾。此外,规范路径必须是表示绝对路径的最短字符串。
示例 1:
输入:"/home/" 输出:"/home" 解释:注意,最后一个目录名后面没有斜杠。
示例 2:
输入:"/../" 输出:"/" 解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。
示例 3:
输入:"/home//foo/" 输出:"/home/foo" 解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4:
输入:"/a/./b/../../c/" 输出:"/c"
示例 5:
输入:"/a/../../b/../c//.//" 输出:"/c"
示例 6:
输入:"/a//b////c/d//././/.." 输出:"/a/b/c"
1 class Solution: 2 def simplifyPath(self, path: str) -> str: 3 if not path: 4 return '' 5 6 stack = [] 7 path = path.split("/") 8 9 for item in path: 10 if item == "..": 11 if stack : 12 stack.pop() 13 14 elif item and item != ".": 15 stack.append(item) 16 17 return "/" + "/".join(stack)
739. 每日温度
根据每日 气温
列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0
来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
,你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]
。
提示:气温
列表长度的范围是 [1, 30000]
。每个气温的值的均为华氏度,都是在 [30, 100]
范围内的整数。
1 class Solution: 2 def dailyTemperatures(self, T: List[int]) -> List[int]: 3 if not T: 4 return list() 5 6 T_len = len(T) 7 res = [0 for _ in range(T_len)] 8 stack = list() 9 10 for index, value in enumerate(T): 11 if not stack: 12 stack.append((index, value)) 13 continue 14 15 top_stack_index, top_stack_value = stack[-1] 16 17 while value > top_stack_value: 18 res[top_stack_index] = index - top_stack_index 19 stack.pop() 20 if stack: 21 top_stack_index, top_stack_value = stack[-1] 22 else: 23 break 24 25 stack.append((index, value)) 26 27 return res 28
NC 90 设计getMin功能的栈
示例1
输入
[[1,3],[1,2],[1,1],[3],[2],[3]]
返回值
[1,2]
备注:
有三种操作种类,op1表示push,op2表示pop,op3表示getMin。你需要返回和op3出现次数一样多的数组,表示每次getMin的答案
1<=操作总数<=1000000
-1000000<=每个操作数<=1000000
数据保证没有不合法的操作
1 # 2 # return a array which include all ans for op3 3 # @param op int整型二维数组 operator 4 # @return int整型一维数组 5 # 6 class Solution: 7 def __init__(self): 8 self.stack = [] 9 self.min_stack = [] 10 11 def getMinStack(self , op ): 12 # write code here 13 res = [] 14 for index in range(len(op)): 15 if op[index][0] == 1: 16 self.__Push(op[index][1]) 17 elif op[index][0] == 2: 18 self.__Pop() 19 else: 20 res.append(self.__getMin()) 21 22 return res 23 24 def __Push(self, x): 25 self.stack.append(x) 26 if not self.min_stack or self.min_stack[-1] >= x: 27 self.min_stack.append(x) 28 29 def __Pop(self): 30 if self.stack: 31 if self.stack[-1] == self.min_stack[-1]: 32 self.min_stack.pop() 33 self.stack.pop() 34 35 def __getMin(self): 36 return self.min_stack[-1] 37
NC 123 序列化二叉树
题目描述二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
输入
{8,6,10,5,7,9,11}
返回值
{8,6,10,5,7,9,11}
1 # -*- coding:utf-8 -*- 2 # class TreeNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 import collections 8 class Solution: 9 def Serialize(self, root): 10 # write code here 11 12 if not root: 13 return "" 14 queue = collections.deque([root]) 15 res = [] 16 while queue: 17 node = queue.popleft() 18 if node: 19 res.append(str(node.val)) 20 queue.append(node.left) 21 queue.append(node.right) 22 else: 23 res.append('None') 24 print(res) 25 return '[' + ','.join(res) + ']' 26 27 def Deserialize(self, data): 28 # write code here 29 if not data: 30 return None 31 dataList = data[1:-1].split(',') 32 root = TreeNode(int(dataList[0])) 33 queue = collections.deque([root]) 34 i = 1 35 while queue: 36 node = queue.popleft() 37 if dataList[i] != 'None': 38 node.left = TreeNode(int(dataList[i])) 39 queue.append(node.left) 40 i += 1 41 if dataList[i] != 'None': 42 node.right = TreeNode(int(dataList[i])) 43 queue.append(node.right) 44 i += 1 45 return root
NC 64 二叉搜索树与双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
1 # class TreeNode: 2 # def __init__(self, x): 3 # self.val = x 4 # self.left = None 5 # self.right = None 6 7 # 8 # 9 # @param pRootOfTree TreeNode类 10 # @return TreeNode类 11 # 12 class Solution: 13 def Convert(self , pRootOfTree ): 14 # write code here 15 if not pRootOfTree: 16 return None 17 stack = self._preorderIravel(pRootOfTree) 18 for i in range(1, len(stack)): 19 stack[i-1].right = stack[i] 20 stack[i].left = stack[i-1] 21 return stack[0] 22 23 def _preorderIravel(self, root): 24 if not root: 25 return list() 26 27 node = root 28 stack = [] 29 res = list() 30 while node or stack: 31 if node: 32 stack.append(node) 33 node = node.left 34 else: 35 node = stack.pop() 36 res.append(node) 37 node = node.right 38 return res