两个栈实现Z字形输出二叉树
二叉树的之字形层序遍历
http://www.nowcoder.com/questionTerminal/47e1687126fa461e8a3aff8632aa5559
两个栈实现Z字形输出二叉树
写一下自己的思路。先考虑底层基础是层序遍历二叉树,然后基于这个算法进行修改,关键点在于如何确定正确的Z字型顺序。
首先,层序遍历使用到了一个队列数据结构,但是在这里是行不通的,因为一个队列只能保证同一个方向的数据流动,因此考虑使用两个存储结构。
本方法首先通过维护一个boolean型变量l2r:意思是当前顺数是否是left to right;
另外,创建两个Stack 栈结构:stakc1 和 stack2 来分别保存正向和逆向时的 TreeNode 。
case1:
l2r 为 true,即当前需要正向输出,此时按照上述规则,数据在 stack1 中保存,然后按照层序遍历二叉树的思想将数据从 stack1 中依次取出,且每次弹出节点时都需要判断其左右子树是否存在,若存在,需要按照 left->right 从左到右的顺序压入 stack2 中保存。最后不要忘了对 l2r 变量的维护,需要取反,意思是下次输出顺序需要变化。
case2:
l2r 为false,即当前需要反向输出,按照规则,数据当前存储在 stack2 中,同样依次取出数据,并判断其左右子树,若存在则需要按照 right -> left 从右到左的顺序压入 stack1 中保存,并维护 l2r变量。
完整代码如下:
public static List<List<Integer>> z_Traverse(TreeNode root){
List<List<Integer>> res = new ArrayList<>();
if(root==null){
return res;
}
Stack<TreeNode> stack1 = new Stack<>();
Stack<TreeNode> stack2 = new Stack<>();
stack1.push(root);
List<Integer> ans = null;
boolean l2r = true;
while(!stack1.isEmpty() || !stack2.isEmpty()){
int size = Math.max(stack1.size(), stack2.size());
ans = new ArrayList<Integer>();
while(size>0){
TreeNode temp = null;
if(l2r){
temp = stack1.pop();
if(temp.left!=null){
stack2.push(temp.left);
}
if(temp.right!=null){
stack2.push(temp.right);
}
}else{
temp = stack2.pop();
if(temp.right!=null){
stack1.push(temp.right);
}
if(temp.left!=null){
stack1.push(temp.left);
}
}
ans.add(temp.val);
size--;
}
l2r = !l2r;
res.add(ans);
}
return res;
}
