好几天没有继续做题,看来是收到一个肯要我的公司的offer以后就懈怠了,题还是要继续刷起来~
栈的压入、弹出序列
题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
class Solution:
def IsPopOrder(self, pushV, popV):
temp=[]
while 1:
if not popV:#popV一旦为空退出循环
break
if temp and temp[-1]==popV[0]:#如果temp不空且末元素等于popV首元素,同时弹出这两个元素
temp.pop()
popV.pop(0)
elif temp and not pushV and temp[-1]!=popV[0]:#如果temp不空且pushV已空且末元素不等,表示不是正确的出栈顺序
return False
else:#其他情况继续进行压栈操作
temp.append(pushV.pop(0))
return True
本题需要借助一个辅助栈来模拟两个栈的压入与弹出操作
从上往下打印二叉树
题目描述:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回从上到下每个节点值列表,例:[1,2,3]
def PrintFromTopToBottom(self, root):
# write code here
ls=[]
temp=[]
if not root:#如果根节点为空,直接返会空
return []
temp.append(root)#把根节点放进去
while temp:
#temp不空的时候,想把首元素的左右子树放进去(如果存在)
if temp[0].left:
temp.append(temp[0].left)
if temp[0].right:
temp.append(temp[0].right)
ls.append(temp.pop(0).val)#向ls中添加每一次弹出的节点的值
return ls
本题类似于广度优先搜索算法,使用队列的方法进行操作即可
二叉搜索树的后序遍历序列
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
if not sequence:
return False
else:
return self.judge(sequence)
def judge(self,seq):
if not seq:
return True
elif len(seq)==1 or len(seq)==2:#如果只有一个元素或者两个元素,证明一定是后序遍历
return True
else:
leftroot=-1
rightroot=len(seq)-2#找到右子树的根节点
for i in range(1,len(seq),1):
if(seq[i]>seq[-1] and seq[i-1]<seq[i]):
leftroot=i-1#找到左子树的根点
break
#判断是否是合法的右子树节点
if(seq[rightroot]<seq[-1]):#如果不存在右子树
rightroot=-1
#首先判断左右子树是不是都满足左树小于根节点,右树大于根节点
judge1=True
judge2=True
#判断左右子树内所有元素是否合法
for i in range(0,leftroot+1,1):
judge1=judge1 and seq[i]<seq[-1]
for i in range(leftroot+1,rightroot+1,1):
judge2=judge2 and seq[i]>seq[-1]
#返回是否合法结果以及递归左右子树是否合法
return judge1 and judge2 and self.judge(seq[0:leftroot+1]) and self.judge(seq[leftroot+1:rightroot+1])
本题的judge函数是一个递归函数,对于只有一两个元素的序列,一定是后序遍历序列,这是递归的终止条件,递归的时候,要找到递归的左树序列与右树序列,这是递归的关键所在。