题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
题目分析
1:与BFS有关。
2:左右的不同顺序可以用两个栈来存储。一个栈存储左到右的,一个存储右到左的。
3:在pop时,直接将val存储进list
代码
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();//返回值设置
ArrayList<Integer> list;//每一层的返回
if(pRoot == null) return res;
Stack<TreeNode> sLeft = new Stack<>();
Stack<TreeNode> sRight = new Stack<>();
boolean LTR = true; // 判断变量,判断是左-右还是右-左
sRight.push(pRoot); //第一行是左-右,加入sRight栈,弹出顺序相反,即左-右加入到list中
TreeNode cur;
while(!sLeft.isEmpty() || !sRight.isEmpty()){
list = new ArrayList<>();
if(LTR){ //这一行为从左到右
while(!sRight.isEmpty()){ //上一层的栈为空时退出
cur = sRight.pop();
list.add(cur.val);//list按弹出顺序加入值。
//这一层左到右,下一层就是右到左,在栈的顺序就是左到右,先加左儿子再右儿子
if(cur.left != null){
sLeft.push(cur.left);
}
if(cur.right != null){
sLeft.push(cur.right);
}
}
}else{ // 如果相反 都相反。注意左右儿子添加的顺序
while(!sLeft.isEmpty()){
cur = sLeft.pop();
list.add(cur.val);
if(cur.right != null){
sRight.push(cur.right);
}
if(cur.left != null){
sRight.push(cur.left);
}
}
}
LTR = !LTR; //更新
res.add(list);
}
return res;
}
京公网安备 11010502036488号