按之字形顺序打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解题思路
利用Java中的LinkedList的底层实现是双向链表的特点
- 可用做队列,实现树的层次遍历
- 可双向遍历,奇数层从前往后遍历,偶数层从后往前遍历
代码
`import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
/**
- 剑指offer一刷:按之字形顺序打印二叉树
- @author User
- @create 2019-06-09-21:23
*/
public class jzo59 {
public ArrayList<ArrayList> Print(TreeNode pRoot) {
ArrayList<ArrayList> ret=new ArrayList<>();
if (pRoot==null){
return ret;
}
ArrayList list=new ArrayList<>();
LinkedList queue=new LinkedList<>();
queue.addLast(null); //层分隔符
queue.addLast(pRoot);
boolean leftToRight=true;
while (queue.size()!=1){
TreeNode node=queue.removeFirst();
if (node==null){//到达层分隔符
Iterator<TreeNode> iter=null;
if (leftToRight){
iter=queue.iterator();
}else {
iter=queue.descendingIterator(); //从后往前遍历
}
leftToRight=!leftToRight;
while (iter.hasNext()){
TreeNode temp=(TreeNode)iter.next();
list.add(temp.val);
}
ret.add(new ArrayList<Integer>(list));
list.clear();
queue.addLast(null); //添加分层符
continue;
}
if(node.left!=null){
queue.addLast(node.left);
}
if (node.right!=null){
queue.addLast(node.right);
}
}
return ret;
}
public static void main(String[] args){
TreeNode node1=new TreeNode(1);
TreeNode node2=new TreeNode(2);
TreeNode node3=new TreeNode(3);
TreeNode node4=new TreeNode(4);
TreeNode node5=new TreeNode(5);
TreeNode node6=new TreeNode(6);
TreeNode node7=new TreeNode(7);
TreeNode node8=new TreeNode(8);
TreeNode node9=new TreeNode(9);
node1.left=node2;
node1.right=node3;
node2.left=node4;
node2.right=node5;
node3.left=node6;
node3.right=node7;
node4.left=node8;
node4.right=node9;
jzo59 so=new jzo59();
System.out.println(so.Print(node1));
}
}`
把二叉树打印成多行
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
解题思路
- 递归完成
代码
`
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/**
- 剑指offer一刷:把二叉树打印成多行
- @author User
- @create 2019-06-10-11:22
*/
public class jzo60 {
ArrayList<ArrayList> Print(TreeNode pRoot) {
ArrayList<ArrayList> list = new ArrayList<>();
depth(pRoot, 1, list);
return list;
}
private void depth(TreeNode root, int depth, ArrayList<ArrayList<Integer>> list) {
if(root == null) return;
if(depth > list.size()) {
list.add(new ArrayList<Integer>());
}
list.get(depth -1).add(root.val);
depth(root.left, depth + 1, list);
depth(root.right, depth + 1, list);
}
ArrayList<ArrayList<Integer> > Print1(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(pRoot == null){
return result;
}
Queue<TreeNode> layer = new LinkedList<TreeNode>();
ArrayList<Integer> layerList = new ArrayList<Integer>();
layer.add(pRoot);
int start = 0, end = 1;
while(!layer.isEmpty()){
TreeNode cur = layer.remove();
layerList.add(cur.val);
start++;
if(cur.left!=null){
layer.add(cur.left);
}
if(cur.right!=null){
layer.add(cur.right);
}
if(start == end){
end = layer.size();
start = 0;
result.add(layerList);
layerList = new ArrayList<Integer>();
}
}
return result;
}
public static void main(String[] args){
TreeNode node1=new TreeNode(1);
TreeNode node2=new TreeNode(2);
TreeNode node3=new TreeNode(3);
TreeNode node4=new TreeNode(4);
TreeNode node5=new TreeNode(5);
TreeNode node6=new TreeNode(6);
TreeNode node7=new TreeNode(7);
TreeNode node8=new TreeNode(8);
TreeNode node9=new TreeNode(9);
node1.left=node2;
node1.right=node3;
node2.left=node4;
node2.right=node5;
node3.left=node6;
node3.right=node7;
node4.left=node8;
node4.right=node9;
jzo60 so=new jzo60();
System.out.println(so.Print(node1));
System.out.println(so.Print1(node1));
}
}`