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

把二叉树打印成多行

题目描述

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

思路

  1. 都是从左往右打印,我们可以使用队列
  2. 若要一行一行区别开来打印,我们可以用两个队列
  3. 也可以用一个队列,然后用两个标志位来标注哪些是属于一行里的结点,一个指针指向下一行的最后一个进队列的(point),一个指针指向上一行最后一个进入队列的(end),当出队列到end时,打印上一行,然后把end指针下移到下一行point处,继续循环打印

代码

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

/*
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>> result = new ArrayList<ArrayList<Integer>>();
	    if (pRoot == null) {
	    	return result;
	    }
	    TreeNode point = null;
	    TreeNode end = null;
	    Queue<TreeNode> queue = new LinkedList<TreeNode>();
	    queue.offer(pRoot);
	    point = pRoot;
	    end = pRoot;
	    ArrayList<Integer> list = new ArrayList<Integer>();
	    while (!queue.isEmpty()) {
	    	TreeNode node = queue.poll(); // 出队列,然后分别将左右节点入队列
	    	if (node.left != null) {
	    		queue.offer(node.left);
	    		point = node.left; // 更新当前这行最后一个进入队列的
	    	}
	    	if (node.right != null) {
	    		queue.offer(node.right);
	    		point = node.right;
	    	}
	    	list.add(node.val);
	    	if (node == end) {
	    		result.add(list);
	    		list = new ArrayList<Integer>();
	    		end = point; // 移到下一行中
	    	}
	    }
	    return result;
    }

}
时间: 2024-08-11 08:51:43

把二叉树打印成多行-剑指Offer的相关文章

剑指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---把二叉树打印成多行

题目:把二叉树打印成多行 要求:从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. /* 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

剑指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

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

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

[剑指Offer] 60.把二叉树打印成多行

题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. [思路]使用队列实现二叉树的层次遍历. 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 }; 10 */ 11 class Solution 12 { 13 public:

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

题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 解题思路:可以直到,每次打印一个结点,然后打印下一行时总是先打印其左子结点,然后打印其右子结点.先入先出,使用队列处理.使用toBeprint记录当前行打印的个数,每存入一个-1:nextlevel记录下一行打印结点个数:一行打印完,toBeprint = nextlevel:nextlevel = 0: 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *lef

《剑指offer》:[60]把二叉树打印成多行

题目:从上到下安层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行. 例如,图(1)中二叉树以及打印结果为: 这个题其实很简单,我们只需要设置两个变量就可以搞定.一个变量表示当前层中还没有打印的结点数,另一个变量表示下一层结点的数目. 具体实现代码如下: #include <iostream> #include <queue> using namespace std; struct BinaryTree { int data; BinaryTree *pLeft; Bi

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

题目描述: 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 分析: 二叉树的层次遍历,利用队列. 代码: 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 }; 10 */ 11 class Solution { 12 public:

剑指Offer-60.把二叉树打印成多行(C++/Java)

题目: 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 分析: 层次打印二叉树,在打印二叉树结点的同时,保存好结点的左右孩子,不断的重复打印,直到需要打印的数组为空即可. 程序: C++ class Solution { public: vector<vector<int> > Print(TreeNode* pRoot) { if(pRoot == nullptr) return res; vector<TreeNode*> printS; vect