剑指offer刷题-把二叉树打印成多行(二叉树的前中后序遍历及层序遍历补充)

题目描述

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

思路

题目分析:
在这里插入图片描述
如上图所示,按层打印的顺序,应该先打印根结点,从树的根结点开始分析。为了接下来能够打印值为8的结点的两个子结点,我们应该在遍历该结点时把值为6和10的两个结点保存到一个容器里,现在容器内就有两个结点。按照从左到右打印的要求,我们先取出为6的结点。打印出值6之后把它的分别为5和7的两个结点放入数据容器。此时数据容器中有三个结点,值分别为10、5和7。接下来我们从数据容器中取出值为10的结点。注意到值为10的结点比值为5、7的结点先放入容器,此时又比这两个结点先取出,这就是我们通常说的先入先出,因此不难看出这个数据容器应该是一个队列。由于值为5、7、9、11的结点都没有子结点,因此只要依次取出打印即可。

层序遍历问题?

一开始的思路是对于给定的根节点,查询是否存在左右子节点,若存在,则打印并分别递归的查询子节点是否存在左右子节点。没有想到要将结点存放在容器中,而是直接获取结点的值,这样遍历二叉树,但是并不是层序遍历,不能保证每一层打印一行。

怎么确定一层已经遍历结束从而将下一层在另一行打印?

需要标志位来确定。

遍历过程如下:
在这里插入图片描述
代码实现:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
   
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
   
        ArrayList<ArrayList<Integer>> res  = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> tmp = new ArrayList<Integer>();
        //队列存放结点,先进先出
        Queue<TreeNode> nodes = new LinkedList<TreeNode>();
        //now表示目前层还剩几个结点,next表示下一层有几个结点
        int now = 1, next = 0;
        //如果结点为空,则返回空
        if(pRoot == null)
            return res;
        //将根节点添加
        nodes.add(pRoot);
        while( !nodes.isEmpty())
        {
   
        	//每次取出一个结点,当前层剩余结点数减一
            TreeNode node = nodes.remove();
            now--;
            tmp.add(node.val);
            if(node.left!=null)
            {
   
            	//查询左右子节点,若存在则放入队列中,下一层的节点数加一
                nodes.add(node.left);
                next++;
            }
            if(node.right != null)
            {
   
                nodes.add(node.right);
                next++;
            }
            if(now == 0)
            {
   
                res.add(new ArrayList<Integer>(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值