图解算法面试题之层序输出二叉树并输出行号-辅助变量实现

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

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

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

 

01 解释

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

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

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

下面图形详解:

第一行输出过程

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

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

 

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

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

 

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

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

第二行输出过程

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

 

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

 

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

 

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

 

由于此时,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 代码

public static void printBinaryTree1(BinaryTreeNode binaryTree) {
    if (binaryTree == null) {
      return;
    }
    int curLineNumber = 0;
    int curLineCount = 1;
    int nextLineCount = 0;
    Queue<BinaryTreeNode> 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 + "行 ");
        }
      }
    }
  }

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值