剑指offer(五十一)之把二叉树打印成多行

题目描述

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

代码:

<span style="color:#000099;">import java.util.ArrayList;
import java.util.*;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        //先把需要的准备好
        ArrayList<ArrayList<Integer>> arrayList = new ArrayList<>();
        ArrayList<Integer> list = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();//queue 是一个接口

        if(pRoot != null){
            int nextNodes = 0;
            int needPrint = 1;//初始状态,下一层节点0,需要被打印的结点1,下一层节点在循环中递增
            queue.add(pRoot);

            while(!queue.isEmpty()){
                //队不空的情况下
                TreeNode node = queue.peek();
                list.add(node.val);//只需要把结点的值存起来就行了

                if(node.left != null){
                    queue.add(node.left);
                    ++nextNodes;
                }

                if(node.right != null){
                    queue.add(node.right);
                    ++nextNodes;
                }

                queue.poll();//移除队列一个元素

                --needPrint;
                if(needPrint == 0){
                    arrayList.add(new ArrayList(list));//一行打完了,到下一行
                    list.clear();
                    needPrint = nextNodes;
                    nextNodes = 0;
                }
            }
        }

        return arrayList;
    }

}</span>
时间: 2024-11-04 20:04:23

剑指offer(五十一)之把二叉树打印成多行的相关文章

【剑指Offer】61、把二叉树打印成多行

题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题解一:BFS 1 public static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) { 2 ArrayList<ArrayList<Integer>> res = new ArrayList<>(); 3 LinkedList<TreeNode> queue = new LinkedList&

剑指offer系列49:把二叉树打印成多行

有了上一个之字形打印二叉树,这个题就比较简单了. 首先分析这道题的结构,一行一行的输出. 1.如果第一行顺序存储,也就是先存左边在存右边.那么输出的时候也要同样的先左边后右边的顺序.这就是先进先出,所以用队列. 2.如果不顺序存,使用栈来存.第二行就先右边在左边,必须这样第一行输出的时候才可以先左后右.存第三行是根据第二行的弹出顺序决定的.因为第二行的弹出顺序是从左向右,所以第三行的第一个元素必须是第二行左边元素的子树.也就是在栈底.也就是说第三行开始的元素放在栈底只能最后输出,这样必然是不对的

剑指offer(五十)之序列化二叉树

题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 代码: <span style="color:#000099;">/* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public int index =

剑指OFFER之从上往下打印二叉树(九度OJ1523)

题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩

【剑指offer】Q6:重建二叉树

class BTNode: def __init__(self, val): self.left = None self.right = None self.val = val ''' @ construct tree by inorder & preorder ''' def constructByInPre(inorder, instart, inend, preorder, prestart, preend): if inend < instart or preend < pre

剑指Offer:二叉树打印成多行【23】

剑指Offer:二叉树打印成多行[23] 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题目分析 Java题解 package tree; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; public class PrintByLevel { public static void main(String[] args) { TreeNode t1 = n

[ 剑指offer ] 面试题8:二叉树的下一个节点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 解题思路 1.找到所有的可能情况并归纳,写的代码需要把这些情况都覆盖到. 2.具体情况详见书本# -*- coding:utf-8 -*- # class TreeLinkNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None # self

把二叉树打印成多行-剑指Offer

把二叉树打印成多行 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 思路 都是从左往右打印,我们可以使用队列 若要一行一行区别开来打印,我们可以用两个队列 也可以用一个队列,然后用两个标志位来标注哪些是属于一行里的结点,一个指针指向下一行的最后一个进队列的(point),一个指针指向上一行最后一个进入队列的(end),当出队列到end时,打印上一行,然后把end指针下移到下一行point处,继续循环打印 代码 import java.util.ArrayList; i

剑指offer---把二叉树打印成多行

题目:把二叉树打印成多行 要求:从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vector<int> > Print(TreeN