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

    写在开头的话:

    当想写这个的时候,发现已经有人做了这个工作了,详情请见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)的操作,因此时间复杂度较高,感觉是一个明显的缺点。。。

你可能感兴趣的:(剑指offer)