3.3python如何从顶部开始逐层打印二叉树结点数据

题目描述:

给定一棵二叉树,要求逐层打印二叉树结点的数据,例如有如下二叉树:
在这里插入图片描述
对这棵二叉树层序遍历结果为:1,2,3,4,5,6,7。

思路:

为了实现对二叉树的层序遍历,就要求在遍历一个结点的同时同时记录下它的孩子结点信息,然后按照这个记录的顺序来访问结点的数据,在实现的时候可以采用队列来存储当前遍历到的结点的孩子结点,从而实现二叉树的层序遍历,遍历过程如下图所示:
在这里插入图片描述
在上图中,图(1)首先把根节点 1 放到队列里面,然后开始遍历。图(2)队列首元素(结点1)出队列,同时它的孩子结点 2 和结点 3 进队列;图(3)接着出队列的结点为2,同时它的孩子结点 4 和 5 放到队列里面,依次类推就可以实现对二叉树的层序遍历。

算法性能分析:
在二叉树的层序遍历中,对树的各个结点只进行了一次访问,所以时间复杂度为O(1),此外,这种方法还使用了队列来保存遍历的中间结点,所使用队列的大小取决于二叉树中每一层结点个数的最大值(队首出队时,它的孩子结点会进入队列)
在这里插入图片描述

代码实现:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2020/1/23 16:05
# @Author  : buu
# @Software: PyCharm
# @Blog    :https://blog.csdn.net/weixin_44321080
from collections import deque


class BiTNode:
    def __init__(self):
        self.data = None
        self.lchild = None
        self.rchild = None


def array2treee(arr, start, end):
    """
    把有序数组转换为二叉树
    :param arr:
    :param start:
    :param end:
    :return:
    """
    root = None
    if end >= start:
        root = BiTNode()
        mid = (start + end + 1) // 2
        root.data = arr[mid]  # 树的根节点为数组中间的元素
        # print(root.data,end=' ')
        root.lchild = array2treee(arr, start, mid - 1)  # 递归地构建左子树
        root.rchild = array2treee(arr, mid + 1, end)  # 递归地构建右子树
    else:
        root = None
    return root


def printTreeLayer(root):
    """
    层次遍历树并打印结点
    :param root: 要遍历的树的根节点
    :return:
    """
    if root == None:
        return
    queue = deque()
    queue.append(root)
    while len(queue) > 0:
        p = queue.popleft()  # 队首出队列
        print(p.data,end=' ')
        if p.lchild != None:
            queue.append(p.lchild)  # 左孩子存在,则入队
        if p.rchild != None:
            queue.append(p.rchild)  # 右孩子存在,则入队


if __name__ == '__main__':
    arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    root = array2treee(arr, 0, len(arr) - 1)
    print('result: ', end='')
    printTreeLayer(root)

结果:
在这里插入图片描述

end

发布了76 篇原创文章 · 获赞 2 · 访问量 2560

猜你喜欢

转载自blog.csdn.net/weixin_44321080/article/details/104076293