1.非递归中序遍历
用栈的方式完成,由于后进先出的特性,不断压入根节点的所有左节点直到当前节点为空,然后弹出节点,并且遍历节点的右节点。如果有节点有左子树,则继续压入。。
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
# cur当做指针
cur = root
res = []
stack = []
while cur or stack:
# 把左子树压入栈中
while cur:
stack.append(cur)
cur = cur.left
# 输出栈顶元素
cur = stack.pop()
res.append(cur.val)
# 检查右子树
cur = cur.right
return res
2. 重建二叉树
根据前序和中序遍历,返回后序遍历
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
if len(pre) == 0:
return None
if len(pre) == 1:
# 按照树节点的结构定义!!!
return TreeNode(pre[0])
# 找到根节点,按照树节点的结构定义!!!
root = TreeNode(pre[0])
# 在中序遍历中找到根节点,并且划分左\右子树
root_p = tin.index(root.val)
root.left = self.reConstructBinaryTree(pre[1:root_p+1], tin[:root_p])
# 注意下标:tin[root_p+1:]
root.right = self.reConstructBinaryTree(pre[root_p+1:], tin[root_p+1:])
return root
3. 用两个队列实现一个栈
解法:一个队列放入,一个队列输出。因为栈是后入先出,所以把q1的元素依次删除并插入q2,再删除最后一个元素。然后q1赋值为q2,q2初始化为空,这样才能不断删除。
# 用两个队列实现一个栈
class Stack:
def __init__(self):
self.q1 = []
self.q2 = []
def append(self, nums):
self.q1.append(nums)
return self.q1
def pop(self):
while len(self.q1) != 1:
self.q2.append(self.q1.pop(0))
stack_top = self.q1.pop(0)
self.q1 = self.q2
self.q2 = []
return stack_top
a = Stack()
a.append(1)
a.append(2)
a.append(3)
a.append(4)
print(a.append(5))
print(a.pop())
print(a.pop())
print(a.append(7))
4. 定义类的规范!
注意格式:面试时,class 之后加上名称,不带括号;初始化定义写法为def。self代表类的实例。
class Person:
def __init__(self, name = 'Charlie', age=8):
self.name = name
self.age = age
def say(self, content):
print(content)