python(剑指offer21-24题)

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值