您的位置:首页 > 编程语言 > Python开发

《剑指offer》Python语言 面试题61:按之字形顺序打印二叉树

2017-11-07 20:49 645 查看
    写在开头的话:

    当想写这个的时候,发现已经有人做了这个工作了,详情请见Python基础算法/剑指offer,然而依然决定自己写下这个系列,作为算法部分的巩固和提高。在自己写完后会借鉴Python基础算法/剑指offer的代码,如有部分重复,还请见谅。

    

    书上的方法是用两个栈来完成,看到有面试题让用一个队列来完成,这里用一个list来完成吧,代码如下:

# -*- coding: UTF-8 -*-.
class Node(object):
"""节点类"""
def __init__(self, data = -1, lchild = None, rchild = None, isEmpty = 0):
self.data = data
self.lchild = lchild
self.rchild = rchild
self.isEmpty = isEmpty

class BinaryTree(object):
"""树类"""
def __init__(self):
self.root = Node(isEmpty = 1)

def add(self, data):
"""为树增加节点,建立二叉查找树"""
node = Node(data)
if self.root.isEmpty == 1:
self.root = node
else:
treeNode = self.root
while(1):
if node.data <= treeNode.data:
if treeNode.lchild == None:
treeNode.lchild = node
break
else:
treeNode = treeNode.lchild
else:
if treeNode.rchild == None:
treeNode.rchild = node
break
else:
treeNode = treeNode.rchild

def printTree(self):
"""按之字形顺序打印二叉树"""
if self.root == None:
return
myList = [self.root]
flagForward = 0# 为0表示下一行逆序打印,为1表示下一行正序打印
# 记录该行的节点数目和下一行的节点数目
numberNow, numberNext = 1, 0
while(numberNow or numberNext):
# 表示在该行查找
if numberNow:
# 总是将先放入的先打印出来
node = myList.pop(0)
numberNow -= 1
print node.data,
# 根据flagForward的值改变左右子树的打印数学
if flagForward:
if node.rchild:
myList.insert(numberNow, node.rchild)
numberNext += 1
if node.lchild:
myList.insert(numberNow, node.lchild)
numberNext += 1
else:
if node.lchild:
myList.insert(numberNow, node.lchild)
numberNext += 1
if node.rchild:
myList.insert(numberNow, node.rchild)
numberNext += 1
# 表示该行结束了
else:
# 下一行变成该行
if numberNext:
numberNow, numberNext = numberNext, 0
# 正方向逆序
flagForward = ~flagForward

def test():
'Test the program.'
arr = [5, 6, 1, 4, 2, 69, -1, 24]
tree = BinaryTree()
for item in arr:
tree.add(item)
# 5
# / \
# 1 6
# / \ \
# -1 4 69
# / /
# 2 24
print '按之字形顺序打印二叉树:'
tree.printTree()

if __name__ == "__main__":
test()# 5 6 1 -1 4 69 24 2

      由于list的pop(0)和insert()都不是O(1)的操作,因此时间复杂度较高,感觉是一个明显的缺点。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息