剑指Offer[Python版]

面试题5 从尾到头打印单链表

题目描述:
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
解题思路:链表的每个元素由两部分组成,元素值和下一个元素的地址,输入一个链表,开始指针指向第一个节点,操作完一个节点接着将指针指向第二个节点,将元素值保存在列表中,逆序操作是list[::-1]
代码:

class Solution:
    # 返回从尾部到头部的列表值序列,例如[1,2,3]
    def printListFromTailToHead(self, listNode):
        res = []
        while listNode:
            res.append(listNode.val)
            listNode = listNode.next
        return res[::-1]

面试题6 重建二叉树

题目表述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路:
递归思想。前序遍历中第一个元素是根,因此在中序遍历中找到根的位置下标,根将中序遍历分为两部分,分别是左子树和右子树,然后继续递归寻找左右子树的根节点。
代码:

class Solution:
    # 返回构造的TreeNode根节点
    def reConstructBinaryTree(self, pre, tin):
        # write code here
        if not pre or not tin:
            return None
        root = TreeNode(pre[0])
        index = tin.index(pre[0])
        root.left = self.reConstructBinaryTree(pre[1:1+index],tin[:index])
        root.right = self.reConstructBinaryTree(pre[1+index:],tin[1+index:])
        return root

面试题7 用两个栈实现队列

题目表述:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
解题思路:
实现入队和出队操作,stackA用来进栈,stackB出栈,stackB为空则stackA出栈给stackB
代码:

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.stackA = []
        self.stackB = []
    def push(self, node):
        self.stackA.append(node)
    def pop(self):
        if not self.stackB:
            while self.stackA:
                self.stackB.append(self.stackA.pop())
        return self.stackB.pop()

参考题目地址:剑指Offer编程题 牛客网

猜你喜欢

转载自www.cnblogs.com/eugene0/p/12729114.html