【剑指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<>();
 4         if(pRoot==null){
 5             return res;
 6         }
 7         queue.offer(pRoot);
 8         while (queue.size()!=0){
 9             int size=queue.size();
10             ArrayList<Integer> list = new ArrayList<>();
11             for(int i=0;i<size;i++) {
12                 TreeNode node = queue.poll();
13                 if(node==null){
14                     continue;
15                 }
16                 list.add(node.val);
17                 queue.offer(node.left);
18                 queue.offer(node.right);
19             }
20             if(list.size()!=0){
21                 res.add(list);
22             }
23         }
24         return res;
25     }
题解二:递归
 1 public static ArrayList<ArrayList<Integer>> Print01(TreeNode pRoot) {
 2         ArrayList<ArrayList<Integer>> res = new ArrayList<>();
 3         dept(pRoot,1,res);
 4         return res;
 5     }
 6     public static void dept(TreeNode root,int depth,ArrayList<ArrayList<Integer>> res){
 7         if(root==null){
 8             return;
 9         }
10         //判断是否进入到下一层
11         if(depth>res.size()){
12             res.add(new ArrayList<Integer>());
13         }
14         //树的每一层都是一个list,将节点的值放入新创建的一层的list中
15         res.get(depth-1).add(root.val);
16         dept(root.left,depth+1,res);
17         dept(root.right,depth+1,res);
18     }

初始化树:

 1 public static class TreeNode{
 2         int val=0;
 3         TreeNode left=null;
 4         TreeNode right=null;
 5         public TreeNode(int val){
 6             this.val=val;
 7         }
 8     }
 9  private static List<TreeNode> nodeList = null;
10     public static TreeNode createBinTree(int[] array) {
11         nodeList=new LinkedList<TreeNode>();
12         // 将一个数组的值依次转换为TreeNode节点
13         for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {
14             nodeList.add(new TreeNode(array[nodeIndex]));
15         }
16         // 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树
17         for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {
18             // 左孩子
19             nodeList.get(parentIndex).left = nodeList
20                     .get(parentIndex * 2 + 1);
21             // 右孩子
22             nodeList.get(parentIndex).right = nodeList
23                     .get(parentIndex * 2 + 2);
24         }
25         // 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理
26         int lastParentIndex = array.length / 2 - 1;
27         // 左孩子
28         nodeList.get(lastParentIndex).left = nodeList
29                 .get(lastParentIndex * 2 + 1);
30         // 右孩子,如果数组的长度为奇数才建立右孩子
31         if (array.length % 2 == 1) {
32             nodeList.get(lastParentIndex).right = nodeList
33                     .get(lastParentIndex * 2 + 2);
34         }
35         return nodeList.get(0);
36     }

测试:

 1 public static void main(String[] args) {
 2         int[] tree={8,6,10,5,7,9,11};
 3         TreeNode rootNode = createBinTree(tree);
 4         ArrayList<ArrayList<Integer>> lists = Print(rootNode);
 5         for (ArrayList<Integer> list : lists) {
 6             System.out.println(list);
 7         }
 8     }
 9 输出:
10 [8]
11 [6, 10]
12 [5, 7, 9, 11]

原文地址:https://www.cnblogs.com/Blog-cpc/p/12356760.html

时间: 2024-10-25 11:25:20

【剑指Offer】61、把二叉树打印成多行的相关文章

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

[剑指Offer] 61.序列化二叉树

题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 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: 14 char* Serialize(TreeNode*

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

把二叉树打印成多行 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 思路 都是从左往右打印,我们可以使用队列 若要一行一行区别开来打印,我们可以用两个队列 也可以用一个队列,然后用两个标志位来标注哪些是属于一行里的结点,一个指针指向下一行的最后一个进队列的(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

剑指OFFER之重建二叉树(九度OJ1385)

题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数. 输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序

剑指Offer:重建二叉树【7】

剑指Offer:重建二叉树[7] 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 分析 我们首先要明白前序和中序构建二叉树的流程,流程理解了才是解题的关键: 如上图所示,前序遍历可以找到头结点,然后在中序遍历中找到它的位置 比如,1的位置为i,那么startIn~i-1就是它的左子树的中序遍历,st

剑指offer系列47:堆成的二叉树

这个题的主要思路是: 用二叉树的左子树的右子树和右子树的左子树比较,再用左子树的左子树和右子树的右子树比较.(好像有点绕,但其实就是堆成的思想) 剑指offer的说法是用数的前序遍历的两个方法,前序遍历应该是:根->左->右.但是我们用另一种前序遍历:根->右->左.如果这两个序列一样就判断它是对称的. 这两个方法在实现上其实是一样的. 1 class Solution { 2 public: 3 bool isSymmetrical(TreeNode* pRoot) 4 { 5

剑指offer | 从尾到头打印链表

题目描述: “输入一个链表,从尾到头打印链表每个节点的值.” 这是我做的<剑指offer>系列的第一题,好的开头就是成功的一半.然而,我提交了一次,WA!再提交,WA!Com'on! 看来我的开端并不顺利.不过我要的可不是成功的一半,这样的开端怎么能阻挡我AC之路!仔细看了一遍题目要求,看了提交格式.再提交! Finally,AC! 代码如下: 1 /** 2 * struct ListNode { 3 * int val; 4 * struct ListNode *next; 5 * Lis

[剑指offer]8.重建二叉树

题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 代码 /*--------------------------------------- * 日期:2015-07-20 * 作者:SJF0115 * 题目: 8.重建二叉树 * 结果:AC * 网址:http://www.nowcoder