两个栈实现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;
    }
全部评论

相关推荐

10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
futureQAQ:开发:这咋啥都不知道 这怎么测试的 这死去的回忆疯狂攻击我 哈哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务