《剑指offer》python实现

好几天没有继续做题,看来是收到一个肯要我的公司的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函数是一个递归函数,对于只有一两个元素的序列,一定是后序遍历序列,这是递归的终止条件,递归的时候,要找到递归的左树序列与右树序列,这是递归的关键所在。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值