【编程题】按之字形顺序打印二叉树(java实现)
题目来源
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
题目解答
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 {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>>printlist=new ArrayList<ArrayList<Integer>>();
if(pRoot==null)
return printlist;
Stack<TreeNode> oddStack=new Stack<>();
Stack<TreeNode>ovenStack=new Stack<>();
oddStack.add(pRoot);
ArrayList<Integer>innerlist=new ArrayList<>();
boolean layer=false;
while(!oddStack.isEmpty()||!ovenStack.isEmpty()){
if(!layer&&!oddStack.isEmpty()){
pRoot=oddStack.pop();
innerlist.add(pRoot.val);
if(pRoot.left!=null)
ovenStack.add(pRoot.left);
if(pRoot.right!=null)
ovenStack.add(pRoot.right);
}
if(layer&&!ovenStack.isEmpty()){
pRoot=ovenStack.pop();
innerlist.add(pRoot.val);
if(pRoot.right!=null)
oddStack.add(pRoot.right);
if(pRoot.left!=null)
oddStack.add(pRoot.left);
}
if(!layer&&oddStack.isEmpty()){
layer=true;
if(innerlist.size()>0)
printlist.add(new ArrayList<>(innerlist));
innerlist=new ArrayList<>();
}
if(layer&&ovenStack.isEmpty()){
layer=false;
if(innerlist.size()>0)
printlist.add(new ArrayList<>(innerlist));
innerlist=new ArrayList<>();
}
}
return printlist;
}
}
通过main方法调用
import java.util.*;
public class Main7 {
public static void main(String[] args) {
TreeNode root=new TreeNode(1);
root.left=new TreeNode(2);
root.right=new TreeNode(3);
root.left.left=new TreeNode(4);
root.left.right=new TreeNode(5);
root.right.left=new TreeNode(6);
root.right.right=new TreeNode(7);
ArrayList<ArrayList<Integer> >lists= Print(root);
for(ArrayList<Integer>list :lists){
System.out.println(Arrays.toString(list.toArray()));
}
}
public static ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>>printlist=new ArrayList<ArrayList<Integer>>();
if(pRoot==null)
return printlist;
Stack<TreeNode> oddStack=new Stack<>();
Stack<TreeNode>ovenStack=new Stack<>();
oddStack.add(pRoot);
ArrayList<Integer>innerlist=new ArrayList<>();
boolean layer=false;
while(!oddStack.isEmpty()||!ovenStack.isEmpty()){
if(!layer&&!oddStack.isEmpty()){
pRoot=oddStack.pop();
innerlist.add(pRoot.val);
if(pRoot.left!=null)
ovenStack.add(pRoot.left);
if(pRoot.right!=null)
ovenStack.add(pRoot.right);
}
if(layer&&!ovenStack.isEmpty()){
pRoot=ovenStack.pop();
innerlist.add(pRoot.val);
if(pRoot.right!=null)
oddStack.add(pRoot.right);
if(pRoot.left!=null)
oddStack.add(pRoot.left);
}
if(!layer&&oddStack.isEmpty()){
layer=true;
if(innerlist.size()>0)
printlist.add(new ArrayList<>(innerlist));
innerlist=new ArrayList<>();
}
if(layer&&ovenStack.isEmpty()){
layer=false;
if(innerlist.size()>0)
printlist.add(new ArrayList<>(innerlist));
innerlist=new ArrayList<>();
}
}
return printlist;
}
}