题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
题目分析
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; }