描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
好像就是树的层次遍历。
官方题解:利用队列的先进先出循环实现。
# -*- 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],但是感觉还不太理解树的操作,再看几道题。