二叉树-( 二叉树的层次遍历) 方法1 对层迭代解法、方法2 双向队列

方法1

# -*- coding:utf-8 -*-

""" 
Author: leadingme
Mail:leadingme@qq.com
MyWebsite:leadingme.top
"""

# 二叉树的层次遍历
"""
    算法要求:
        给定一颗二叉树,返回其按层次遍历的节点值(逐层地,从左到右访问所有节点)
    示例:
        输入: 3
             / \
            9   20
                / \
               15  7
        输出: [[3],[9,20],[15,7]]
    解题思路:
        以层为单位操作,数的层数越深,节点就越多,且对顺序有要求,所以可以对层进行迭代
"""
class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution(object):
    def levelOrder(self, root: TreeNode) ->list:
        rList = []  # 用来保存最终返回的节点值数组
        subList = [] # 暂时存储上一层节点值
        if root is None:
            return rList
        else:
            cNodeList = [root] # 上一层节点数组
            nNodeList = [] # 下一层节点数组
        while True:
            if cNodeList:  #
                node = cNodeList.pop(0) # 弹出上一层节点数组的第一个值
                subList.append(node.val)
                if node.left and node.right: # 上一层的节点拥有左右节点,则把它的左右节点加入到下一层节点数组中
                    nNodeList.append(node.left)
                    nNodeList.append(node.right)
                elif node.left:    # 上一层的节点只拥有左节点,则把它的左节点加入到下一层节点数组中
                    nNodeList.append(node.left)
                elif node.right:   # 上一层的节点只拥有右节点,则把它的右节点加入到下一层节点数组中
                    nNodeList.append(node.right)
                else:
                    pass
            else:
                # 这里的subList[:]中用到的[:]类似于深度拷贝,改变原数组值,不会影响它,有关知识可以看以下链接
                rList.append(subList[:])  # 将sublist的值(上一层节点的值)赋值给rList
                subList = []  # 置空
                if not nNodeList:
                    break
                else:
                    cNodeList = nNodeList[:]
                    nNodeList = []
        return rList

方法2

from collections import deque
    def serialize(self, root):
        """Encodes a tree to a single string.

        :type root: TreeNode
        :rtype: str
        """
        res = []
        queue = deque()
        queue.append(root)
        while queue:
            cur = queue.popleft()
            if cur:
                res.append(cur.val)
                queue.append(cur.left)
                queue.append(cur.right)
            else:
                res.append(None)
        while res and res[-1]==None:
            res.pop()
        return res

list[:]深度拷贝用法:

https://www.jianshu.com/p/88f4b426d18d

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值