实现二叉树的各种基本运算的算法_图解算法面试题之层序输出二叉树并输出行号-辅助变量实现...

本文详细介绍了如何利用辅助变量实现二叉树的层序输出,并在输出过程中同时打印行号,避免使用额外的数据结构。通过分析输出流程,阐述了初始化变量的重要性以及在不同阶段如何更新这些变量。此外,还提到了其他可能的实现方法,如在节点中添加行号字段或使用占位符。最后给出了具体的Java代码实现。
摘要由CSDN通过智能技术生成

继上一篇图解算法面试题之层序输出二叉树并输出行号-map实现之后,继续进行第二种方式的实现。

我们这次借助辅助变量,不需要多余的map结构来实现行号的输出。

int curLineNumber = 0;// 当前正在打印的行int curLineCount = 1;// 当前行的节点数量int nextLineCount = 0;// 下一行的节点数量
71e25fddbff91346332a046487f42697.png

01 解释

思路就是用curLineNumber记录正在输出的是第几行,curLineCount本行有多少个节点数,每打印一个做减一操作,当为0时,curLineNumber++就是换行啦。

nextLineCount在打印一行的时候,用来计算下一行的数量。一行永远是在一起打印的,所以计算下一行不会有错。当换行时,nextLineCount初始化为0;

还是用队列完成输出的过程。

下面图形详解:

第一行输出过程

初始化①当前行为第0行,curLineNumber=0,②队列元素queue中为root元素。

③当前行的节点数量为1 curLineCount=1,④下一行节点数量为0 nextLineCount=0;

2adcec56b7c943c47c1276706500cdc9.png

弹出队首元素0,输出,curLineCount--;curLineCount=0;

将0的1,2子孩子进入队列,下一行元素数量nextLineCount+=2;

cae57684814edaf06176b4430eb9f65e.gif

由于curLineCount=0,当前行输入完成。

换行curLineNumber++;curLineCount=nextLineCount;nextLineCount=0;

第二行输出过程

弹出队首元素1,输出。当前行数量减一,curLineCount--;curLineCount=1

6745b83482bb9e3a23888a87dad79a66.gif

将1的左右孩子3,4节点入队,nextLineCount加2。nextLineCount=2;

7a53b208371b8e5422402f19c28c6e59.gif

将队首元素2弹出队列并且输出。curLineCount--;curLineCount=0

c35c3db3236395f3e253ab0bc67ebf44.gif

将2的左右孩子节点5,6。进入队列,nextLineCount+=2;nextLineCount=4;

fca5716369293cc75b0d757a0c841d3f.gif

由于此时,curLineCount=0,当前行的值已经为空。换行curLineNumber+=1,

置换当前行值,curLineCount=nextLineCount;nextLineCount=0;

重复上述操作到队列为空。

02 总结

1.我们初始化了四个值:①当前行号curLineNumber=0,②当前行对应的数量curLineCount=1。③下一行数量nextLineCount=0;④队列queue=[root]

2.在输出当前行的值以后,curLineCount--。并且判断输出的值的左右孩子节点是否存在,对下一行的节点数量nextLineCount进行计算。

3.当curLineCount=0时换行,即curLineNumber++;同时置换curLineCount=nextLineCount;nextLineCount=0;

4.循环到队列为空时结束。

03 其他实现

实现方式不止一种,还有其他比如,方法(1)在树的节点中加上一个多余的字段用于标记是第几层。但是需要和面试官沟通是否允许多加字段。

方法(2)用一个占位符,比如Integer.MaxValue. 在队列中,放入初始化节点root,同时在放一个占位符表示这一行的结束。通常一行节点输出结束,那么它的下一行节点也刚好进入队列完毕,所以此时可以在队列里放一个占位符表示下一行的结束。

小伙伴们还有其他实现想法吗?

04 代码实现

public static void printBinaryTree1(BinaryTreeNode binaryTree) { if (binaryTree == null) { return; } int curLineNumber = 0; int curLineCount = 1; int nextLineCount = 0; Queue treeNodeQueue = new LinkedBlockingQueue<>(); treeNodeQueue.add(binaryTree); System.out.print("第" + curLineNumber + "行 "); while (!treeNodeQueue.isEmpty()) { BinaryTreeNode tmpTreeNode = treeNodeQueue.remove(); System.out.print(tmpTreeNode.value + " "); curLineCount --; if (tmpTreeNode.leftChild != null) { treeNodeQueue.add(tmpTreeNode.leftChild); nextLineCount ++; } if (tmpTreeNode.rightChild != null) { treeNodeQueue.add(tmpTreeNode.rightChild); nextLineCount ++; } if (curLineCount <= 0) { curLineCount = nextLineCount; nextLineCount = 0; curLineNumber ++; if (!treeNodeQueue.isEmpty()) { System.out.println(); System.out.print("第" + curLineNumber + "行 "); } } }}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值