JZ22 从上往下打印二叉树

描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

好像就是树的层次遍历。

官方题解:利用队列的先进先出循环实现。

# -*- coding:utf-8 -*-
#class TreeNode:
#    def __init__(self, x):
#        self.val = x
#        self.left = None
#        self.right = None
class Solution:
    def PrintFromTopToBottom(self, root):
        # write code here
        if not root:           #首先判断是否存在root
            return []
        tree_node = []         #创建二叉树列表
        level = [root]         #每一层包含的节点
        while level:
            queue = level.pop(0)               #添加到辅助队列中
            tree_node.append(queue.val)        #弹出后添加到列表中
            if queue.left:                     #如果只存在左节点
                level.append(queue.left)
            if queue.right:                    #同理只存在右节点
                level.append(queue.right)

        return tree_node

还有一个双端队列:

# -*- coding:utf-8 -*-
#class TreeNode:
#    def __init__(self, x):
#        self.val = x
#        self.left = None
#        self.right = None
from collections import deque
class Solution:
  def PrintFromTopToBottom(self, root):
      # write code here
      if not root:           #首先判断是否存在root
          return []
      tree_node, que = [], deque()    #初始化要打印二叉树的列表,以及双端队列对象
      que.append(root)
      while que:
          node = que.popleft()        #返回并弹出每层的队首元素
          tree_node.append(node.val)  #添加到二叉树打印列表中
          if node.left:               #只存在左节点的情况
              que.append(node.left)
          if node.right:              #只存在右节点的情况
              que.append(node.right)
      return tree_node

官方给的注释很详细,就是我还不太清楚怎么输入官方的题解呢?

class Node:
    def __init__(self, data):
        self.left = None
        self.right = None
        self.data = data

    def insert(self, data):
    # 将新值与父节点进行比较
        if self.data:  # 非空
            if data < self.data:            #新值较小,放左边
                if self.left is None:       #若空,则新建插入节点
                    self.left = Node(data)
                else:                       #否则,递归往下查找
                    self.left.insert(data)
            elif data > self.data:          #新值较大,放右边
                if self.right is None:      #若空,则新建插入节点
                    self.right = Node(data)
                else:                       #否则,递归往下查找
                    self.right.insert(data)
        else:
            self.data = data

    # 打印这棵树,中序遍历
    def PrintTree(self):
        if self.left:
            self.left.PrintTree()
        print( self.data),
        if self.right:
            self.right.PrintTree()

定义了这么一段代码,官方示例输入{5,4,#,3,#,2,#,1}

然后

a = Solution()
root = Node(5)
root.insert(4)
root.insert(3)
root.insert(2)
root.insert(1)
m = a.PrintFromTopToBottom(root)
print(m)

输出结果确实是[5, 4, 3, 2, 1],但是感觉还不太理解树的操作,再看几道题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值