《剑指offer》 Day2

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/EngineerHe/article/details/100049521

《剑指offer》 Day2

从尾到头打印链表

题目:输入一个链表的头结点,从尾到头反过来打印出每一个节点的值。

在不改变现有的链表的数据结构的时候,从头打印链表的话,只能先把链表中的每一个元素记录下来,遍历完了以后再打印。这个过程符合栈的操作,即先入后出,我们先把元素添加,然后最先添加的最后一个输出。

def print_list_reversingly_iteratively(head):
    # 这里用一个列表表示栈
    node_list = []
    
    if not head:
        return None
    
    cur = head
    while cur:
        # 压栈
        node_list.append(cur.elem)
        cur = cur.next

    while node_list:
        # 出栈
        print(node_list.pop(), end=' ')
    print()

还有就是通过递归的操作,递归在本质上就是一个栈的结构,先是往前查找,满足了递归出口条件以后,再反向的传递回来,所以也可以用递归进行反向链表的输出

def print_list_reversingly_recursively(head):
    
    if head != None:
        if head.next != None:
            print_list_reversingly_recursively(head.next)
        print(head.elem, end=' ')

重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果都不含重复的数字。例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的头节点。

二叉树的前序可以知道根节点的位置,根据根节点的值可以找到其在中序遍历中的位置,进一步的划分为左右子树。然后每一个左右子树在根据同样的方法可以找到对应的左根节点和右根节点,所以通过递归就可以构建整个二叉树

# 二叉树定义
class binaryTreeNode():
    def __init__(self, elem=None):
        self.elem = elem
        self.left = None
        self.right = None

# 构建二叉树
def construct_tree(preorder, inorder):
    
    if (not preorder) and (not inorder):
        return None
    
    root_value = preorder[0]
    root = binaryTreeNode(root_value)
    # 根据根节点获取左右子树
    cut = inorder.index(root_value)
    root.left = construct_tree(preorder[1:1+cut], inorder[:cut])
    root.right = construct_tree(preorder[cut+1:], inorder[cut+1:])
    
    return root
# 测试
preorder = [1,2,4,7,3,5,6,8]
inorder = [4,7,2,1,5,3,8,6]
tree = construct_tree(preorder, inorder)

# 宽度遍历,测试构建的树是否正确
def travel_tree(tree):
    if not tree:
        return None
    
    equeue = [tree]
    while equeue:
        
        if equeue[0].left is not None:
            equeue.append(equeue[0].left)
        if equeue[0].right is not None:
            equeue.append(equeue[0].right)
        print(equeue.pop(0).elem)

斐波那契数列

题目1 :求斐波那契数列的第n项

写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下:
KaTeX parse error: Unknown column alignment: * at position 45: …{\begin{array}{*̲{20}{c}} {\begi…

递归解法:

def Fibonacci_recursively(n):
    if n <= 0:
        return 0
    
    if n == 1:
        return 1
    
    return Fibonacci_recursively(n-1) + Fibonacci_recursively(n-2)

动态规划解法:

上面的定义就可以当做一个动态规划的一个状态方程,以此迭代就可以推出第n项

def Fibonacci_dynamic(n):
    res = [0, 1]
    
    if n == 0:
        return res[0]
    if n == 1:
        return res[1]
    
    for i in range(2, n+1):
        tmp = res[0] + res[1]
        res[0] = res[1]
        res[1] = tmp
    
    return res[1]

猜你喜欢

转载自blog.csdn.net/EngineerHe/article/details/100049521