我是靠谱客的博主 沉静招牌,最近开发中收集的这篇文章主要介绍剑指OFFER DAY6第 6 天,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

第 6 天

搜索与回溯算法(简单)BFS


面试题32 - I. 从上到下打印二叉树

首先我们可以知道这道题考查的是搜索算法中的BFS,要想实现BFS我们需要借助队列queue先进先出的性质。python中有一个collections的模块,其中有collections.deque(),它是一个双边列表,同时具有stack和queue的性质。下面是相关资料。

python中的collections.deque()用法和collections板块

解题思路:

先把根节点加入queue

while queue:

        1 queue第一个元素出队列

        2 将该元素vaule加入结果列表

        3 将该元素左右节点加入queue

返回结果列表

class Solution:
    def levelOrder(self, root: TreeNode) -> List[int]:
        if root == None:return []
        queue = collections.deque([root])
        res = []
        while queue:
            node = queue.popleft()
            res.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        return res

剑指 Offer 32 - II. 从上到下打印二叉树 

本题是在上一题的基础上增加了按层输出的要求,于是我在上一层的基础上在某一层把全部的元素都pop出来加到list中,并记录它的offspring,将offspring再加到queue中。

代码如下

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if root == None:return []
        queue = collections.deque([root])
        res = []
        while queue:
            value = []
            for _ in range(len(queue)):
                node = queue.popleft()
                value.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            res.append(value)
        return res

 剑指 Offer 32 - III. 从上到下打印二叉树 III

 

这道题又再上一道题的基础上增加了每隔一层数值反转的要求,我的解题思路如下:

设根节点为0层,偶数层queue从左到右一个一个弹出node,每个节点offspring从左到右一个一个添加到queue中,然后反转queue,来到了奇数层,由于反转了queue技术层node实际上是从右到左弹出,此时offspring也根据这个规则从右到左添加offspring到 queue。然后再反转queue,重复以上操作。

代码如下

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if root == None:return []
        queue = collections.deque([root])
        res = []
        layer = 1
        while queue:
            value = []
            for _ in range(len(queue)):
                node = queue.popleft()
                value.append(node.val)
                if layer%2 ==1:
                    if node.left:
                        queue.append(node.left)
                    if node.right:
                        queue.append(node.right)
                else:
                    if node.right:
                        queue.append(node.right)
                    if node.left:
                        queue.append(node.left)
            layer += 1
            queue.reverse()
            res.append(value)
        return res

刷题心得:

在刷题中我遇到了使用List.reverse() 还是reversed(List)的困难,这里总结两者的区别

List.reverse()是列表自带的函数,只对列表有效

reversed()是Python内置函数,可以对元组,列表,字符串生效,但是返回的是迭代器,

需要经过遍历,List,或者next()等方法

>>>bb = [1,3,5,7]
>>>print(reversed(bb))
<list_reverseiterator object at 0x7fa9700a8730>



>>>bb = [1,3,5,7]
>>>print(list(reversed(bb)))
7,5,3,1

python 中 关于reverse() 和 reversed()的用法介绍 

最后

以上就是沉静招牌为你收集整理的剑指OFFER DAY6第 6 天的全部内容,希望文章能够帮你解决剑指OFFER DAY6第 6 天所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部