面试题32.2:把二叉树打印成多行

题目描述

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

知识点

二叉树,队列


Qiang的思路

这道题和面试题32.1相比,多了分行输出这个要求。在上一题的基础上,这个也很简单实现。因为如果我们在根节点后面添加一个行结束的标志位,那么当该行全部遍历完之后,我们只需要把该标志位放到队列的最末端,这样就相当于在第二行最后面又多了一个标志位,那么便可以区分什么时候需要换行了。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回二维列表[[1,2],[4,5]]
    def Print(self, pRoot):
        # write code here
        if pRoot==None:
            return []
        result=[]
        l=['#', pRoot]
        while l!=['#']:
            c=l.pop(0)
            if c=='#':
                result.append([])
                l.append('#')
                continue
            result[-1].append(c.val)
            if c.left!=None:
                l.append(c.left)
            if c.right!=None:
                l.append(c.right)
        return result

因为我需要判断什么时候给数组增加新行,所以我将标志位放在了行前而不是行后。这个并不影响解题的思路。

需要注意的是,标志位会一直存在在队列中,所以最终的遍历终止条件是当队列中只有标志位时。


Book中的思路

书中对于该题的处理也是在上一题的基础上,增加了两个变量解决的,一个存储着当前行剩余的节点数,另一个变量存储着下一行的节点数。这样便可以知道还需要输出多少节点才能换行,同时在换行时将开始下一行节点数的计数。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回二维列表[[1,2],[4,5]]
    def Print(self, pRoot):
        # write code here
        if pRoot == None:
            return []
        res=[[]]
        l=[pRoot]
        c_number=1
        n_number=0
        while len(l)!=0:
            n=l.pop(0)
            res[-1].append(n.val)
            c_number-=1
            if n.left!=None:
                l.append(n.left)
                n_number+=1
            if n.right!=None:
                l.append(n.right)
                n_number+=1
            if c_number==0 and n_number!=0:
                c_number=n_number
                n_number=0
                res.append([])
        return res

作者原创,如需转载及其他问题请邮箱联系:lwqiang_chn@163.com
个人网站:https://www.myqiang.top

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是二叉树? 引用自百度百科:在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(...
    AnICoo1阅读 1,399评论 0 1
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,491评论 1 31
  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 4,167评论 0 23
  • “你们之后,难道就没有再见过吗?” “见是见过,擦肩而过。”
    荒漠香果海阅读 303评论 1 2
  • 女同学要去澳大利亚女儿那里,此去一别,无以赠送,赋诗一首,写入心中 送 别 七月流火 秋日渐歇 落霞点燃你了的思...
    王者飞鸿阅读 360评论 0 6