两个栈实现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; }