剑指Offer(Python语言)面试题6,7,8

链表:

用Python语言实现一个单链表

#创建节点
class ListNode:
    def __init__(self, data, next=None):
        self.data = data
        self.next = next


#创建同节点
head = ListNode(1)
p = head
for i in range(2, 11):
    #创建新的节点
    p.next = ListNode(i)
    p = p.next

#p重新指向表头   遍历所有的结点输出元素
p = head
while p is not None:
    print(p.data)
    p = p.next


单链表的操作实现:

https://blog.csdn.net/weixin_41447267/article/details/93968762

1.往链表的末尾添加一个节点

2.在链表中找到第一个含有某值的节点并删除该节点。

面试6:从尾到头打印链表

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

思路:遍历的顺序是从头到尾,输出的顺序是从尾到头。也就是第一个遍历的节点最后一个输出,最后一个遍历的节点,第一个输出。这既是典型的后进先出。可以用栈来实现。递归的本质就是栈结构,很自然想到可以用递归来实现。

class Solution:
    def printListFromTailToHead(self, listNode):
        if not listNode:
            return []
        p = listNode
        stack = []
        res = []
        while p:
            stack.append(p.val)
            p = p.next
        for i in range(len(stack)-1,-1,-1):
             res.append(stack[i])
        return res

面试题7.重建二叉树

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

class Solution:
    # 返回构造的TreeNode根节点
    def reConstructBinaryTree(self, pre, tin):
        if not pre:
            return None
        root = TreeNode(pre[0])
        n = tin.index(root.val)    #找到根节点在中序遍历中的下标
        root.left = self.reConstructBinaryTree(pre[1:n+1],tin[:n])
        root.right = self.reConstructBinaryTree(pre[n+1:],tin[n+1:])
        return root

面试题8:二叉树的下一个节点

给定一颗二叉树和其中一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左,右子节点的指针,还有一个指向父节点的指针。

如果一个节点有右子树,那么它的下一个节点就是它的右子树的最左子节点。

没有右子树的情形,如果节点是它父节点左子树,那么它的下一个节点就是它的父节点

如果既没有右子树,并且还是它父节点的右子节点,就可以沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点,如果这样的节点存在那么这个节点的父节点就是我们要找的下一个节点。

# -*- coding:utf-8 -*-
# class TreeLinkNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#         self.next = None
class Solution:
    def GetNext(self, pNode):
        if not pNode: return None
        if pNode.right:
            pNode = pNode.right
            while pNode.left:
                pNode = pNode.left
            return pNode
        else:
            while pNode.next:
                if pNode == pNode.next.left:
                    return pNode.next
                pNode = pNode.next
        return None

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤凰AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值