设计S型层次遍历树的算法,比如根节点是第一层,第二层从左至右遍历,第三层从右至左遍历,第四层再从左至右遍历,以此类推。
利用队列和每层的节点数,思路是记录每层的节点数并把当前层节点放入队列,奇数层从左到右放,偶数层从右到左放。当前层的队列为空表示输出完一层,层数加一。由于要记录的中间变量比较多,我的第一个实现比较复杂。
实现一:
import Queue
class Node(object):
"""docstring for node"""
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
def s_print_tree(self, root):
if root==None:
return
node_Queue = Queue.Queue()
tmp_Queue = []
node_Queue.put(root)
deepth = 1
length = 1
nextlen = 0
flag = 0
while not node_Queue.empty():
if deepth%2==0:
if flag==0:
while not node_Queue.empty():
tmp_Queue.append(node_Queue.get())
while tmp_Queue:
node_Queue.put(tmp_Queue.pop())
flag = 1
node = node_Queue.get()
print node.value
length -= 1
if node.left!=None:
node_Queue.put(node.left)
nextlen += 1
if node.right!=None:
node_Queue.put(node.right)
nextlen += 1
else:
if flag==0:
while not node_Queue.empty():
tmp_Queue.append(node_Queue.get())
while tmp_Queue:
node_Queue.put(tmp_Queue.pop())
flag = 1
node = node_Queue.get()
print node.value
length -= 1
if node.right!=None:
node_Queue.put(node.right)
nextlen += 1
if node.left!=None:
node_Queue.put(node.left)
nextlen += 1
if length==0:
deepth += 1
length = nextlen
nextlen = 0
flag = 0
if __name__ == '__main__':
tree = Node('D',Node('B',Node('A'),Node('C')),Node('E',right=Node('G',Node('F'), Node('H'))))
tree.s_print_tree(tree)
实现二,利用栈来实现,但发现python基本数据结构中竟然没有栈,只有队列。然而python的队列不仅仅是一个先进先出的数据结构,python的队列是线程安全的,可以应用于多线程程序。如果仅仅为了用队列先进先出的和栈的先进后出性质,用队列就可以了,不必再导入Queue模块。
实现二:
import Queue
class Node(object):
"""docstring for node"""
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
def s_print_tree(self, root):
if root==None:
return
node_Queue = []
next_Queue = []
node_Queue.append(root)
deepth = 1
while len(node_Queue)!=0 or len(next_Queue)!=0:
if len(node_Queue)!=0:
if deepth%2==0:
node = node_Queue[-1]
if node.left!=None:
next_Queue.append(node.left)
if node.right!=None:
next_Queue.append(node.right)
print node_Queue[-1].value
del node_Queue[-1]
else:
node = node_Queue[-1]
if node.right!=None:
next_Queue.append(node.right)
if node.left!=None:
next_Queue.append(node.left)
print node_Queue[-1].value
del node_Queue[-1]
else:
node_Queue = next_Queue
next_Queue = []
deepth += 1
if __name__ == '__main__':
tree = Node('D',Node('B',Node('A'),Node('C')),Node('E',right=Node('G',Node('F'), Node('H'))))
tree.s_print_tree(tree)