Python程序员面试算法宝典---解题总结: 第三章 二叉树 3.3 如何从顶部开始逐层打印二叉树节点数据

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第三章 二叉树 3.3 如何从顶部开始逐层打印二叉树节点数据

题目:
给定一棵二叉树,要求逐层打印二叉树节点的数据,例如有如下二叉树:
                    1
            2               3
        4       5       6       7
对这棵二叉树层序遍历的结果为: 1,2,3,4,5,6,7



关键:
1 分析:
遍历的顺序实际就是先遍历根节点,然后遍历左孩子,然后遍历右孩子,
最后遍历左孩子的左孩子和右孩子,遍历右孩子的左孩子和右孩子。
层序遍历,典型的应该用队列。

2 如何根据给定的数组构建二叉树?
可以利用二叉树父子节点编号关系:
假设节点对应值在数组中下标为i,
那么该节点的左孩子的值在数组中下标为2*i+1
那么该节点的右孩子的值在数组中下标为2*i+2

3 Queue
import Queue
queue = Queue.Queue()

参考:
Python程序员面试算法宝典
'''
import Queue

class BinaryTreeNode(object):

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

def buildBinaryTree(data):
    if not data:
        return
    nodes = list()
    for value in data:
        node = BinaryTreeNode(value)
        nodes.append(node)
    length = len(data)
    for i in range(length / 2):
        leftIndex = 2 * i + 1
        rightIndex = 2 * i + 2
        if leftIndex < length:
            nodes[i].left = nodes[leftIndex]
        if rightIndex < length:
            nodes[i].right = nodes[rightIndex]
    return nodes[0]


def levelOrder(root):
    if not root:
        return
    queue = Queue.Queue()
    queue.put(root)
    result = ""
    while not queue.empty():
        node = queue.get()
        if node:
            queue.put(node.left)
            queue.put(node.right)
            if result:
                result += "," + str(node.data)
            else:
                result = str(node.data)
    return result


def process():
    data = list(range(1, 8))
    root = buildBinaryTree(data)
    result = levelOrder(root)
    print result


if __name__ == "__main__":
    process()

猜你喜欢

转载自blog.csdn.net/qingyuanluofeng/article/details/91404375