剑指offer59
按之字形打印二叉树
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
示例
输入
{8,6,10,5,7,9,11}
输出
[[8],[10,6],[5,7,9,11]]
思路
1.利用一个栈一个队列实现,奇数用队列,偶数层用栈
2.利用两个栈实现
代码
利用两个栈实现
import java.util.ArrayList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.Stack;
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
int layer = 1; //层数
//结果集
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
//s1保存奇数层
Stack<TreeNode> s1 = new Stack<TreeNode>();
s1.push(pRoot);
//s2保存偶数层节点
Stack<TreeNode> s2 = new Stack<TreeNode>();
while(!s1.empty() || !s2.empty()){
ArrayList<Integer> temp = new ArrayList<>();
if(layer%2 != 0){ //奇数层
while(!s1.empty()){
TreeNode node = s1.pop();
if(node!=null){
temp.add(node.val);
//下一层偶数层节点压入s2
s2.push(node.left);
s2.push(node.right);
}
}
}else{ //偶数层
while(!s2.empty()){
TreeNode node = s2.pop();
if(node!=null){
temp.add(node.val);
//下一层奇数层节点压入s1,注意顺序
s1.push(node.right);
s1.push(node.left);
}
}
}
if(!temp.isEmpty()){
res.add(temp);
layer++;
}
}
return res;
}
}
/*
思路:
1.利用一个栈一个队列实现,奇数用队列,偶数层用栈
2.利用两个栈实现
本代码利用两个栈实现:以 8,6,10,5,7,9,11为例
1.首先将奇数层根节点8压入栈1,同时将根节点的左、右孩子6和10依次压入栈2,然后,s1为空,层数加一,进入下一层
2.第二层偶数层,先将s2的节点10弹出,同时把10的右、左孩子11和9依次压入栈1,然后把节点6弹出,把6的右、左孩子7和5依次压入栈1
3.第三层奇数层,按照第二层的入栈顺序反向弹出,依次弹出5,7,9,11
*/