21 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)最大的思路就是借助辅助列表或者说是栈
class Solution:
def IsPopOrder(self, pushV, popV):
# write code here
li = []
while pushV:
tem1 = pushV.pop(0)
tem2 = popV.pop(0)
# 从第一位找相同的且pushV不为空
while tem1 != tem2 and pushV is not None:
li.append(tem1)
if not pushV:
break
tem1 = pushV.pop(0)
while tem1 == tem2:
# 若为空退出循环
if not pushV:
break
# 若相等,就比较下一位
tem1 = pushV.pop(0)
tem2 = popV.pop(0)
while li:
# 将辅助列表中的元素与popV的比,若不等就为假
if not popV or li.pop() != popV.pop(0):
return False
return True
22从上往下打印出二叉树的每个节点,同层节点从左至右打印。广度优先
class Solution:
# 返回从上到下每个节点值列表,例:[1,2,3]
def PrintFromTopToBottom(self, root):
# write code here
# 建立列表储存树节点的值
self.res = []
# 如果树节点不为空就存入树节点的值
if root:
self.res.append(root.val)
self.output(root)
return self.res
return self.res
def output(self,root):
if root:
if root.left:
self.res.append(root.left.val)
if root.right:
self.res.append(root.right.val)
# 递归调用,广度优先,遍历子节点
self.output(root.left)
self.output(root.right)
23.输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
*** debug 发现上一个当这个循环为空时,循环的会使用上一个循环的重名变量。
二差搜索树的特征,左子树都小于根节点,右子树都大于根节点
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
if not sequence:
return False
# 获取根节点
root = sequence.pop()
rtree = []
# 选出左子树,和右子树sequence
for i in range(len(sequence)):
if sequence[0] > root:
break
else:
rtree.append(sequence.pop(0))
# 若右子树中存在小于root的节点,则不是后序遍历的结果
for j in sequence:
if j < root:
return False
# 当一个或空时,说明是左子树,否则递归判断左子树,判断其是否是后续遍历
if len(rtree) <= 1:
left = True
else:
left = self.VerifySquenceOfBST(rtree)
#
if len(sequence) <= 1:
right = True
else:
right = self.VerifySquenceOfBST(sequence)
# 当左右子树都满足时说明是后序遍历
return left and right
24.输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 深度优先,使用前序遍历二叉树。
# 这里在添加数列时会因为共享地址而变化,需要用浅复制,再添加。
class Solution:
# 返回二维列表,内部每个列表表示找到的路径
def __init__(self):
# 创建两个数组,用来存储路径
self.pathlist = []
self.path = []
def FindPath(self, root, expectNumber):
# write code here
li = [] # 用来进行复制的数组,剑指offer中不支持浅复制
# 当为空时结束
if not root:
return self.pathlist
self.path.append(root.val)
# 若是满足条件则符合
if root.left is None and root.right is None and root.val == expectNumber:
for i in self.path:
li.append(i)
self.pathlist.append(li)
# 若是左子树不为空,且值小于目标值,则递归遍历下一层
if root.val <= expectNumber and root.left is not None:
self.FindPath(root.left, expectNumber - root.val)
# 若是右子树不为空,且值小于目标值,则递归遍历下一层
if root.val <= expectNumber and root.right is not None:
self.FindPath(root.right, expectNumber - root.val)
# 若是都不符合,则退回到父节点,弹出子节点
self.path.pop()
return self.pathlist