利用双栈实现“之”打印

按之字形顺序打印二叉树

http://www.nowcoder.com/questionTerminal/91b69814117f4e8097390d107d2efbe0

主要思想:在栈1出栈的过程同时按照特定顺序将栈1中的节点的左右孩子压入栈2,当栈1出栈完毕即某一行扫描完毕,同时还将下一行数据压入了栈2,然后继续重复上述过程即可
注意:唯一要注意的是从栈1到栈2压入顺序和从栈2到栈1压入顺序是相反的,为了保证之字形

public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer> > res = new ArrayList<>();
        ArrayList<Integer> item = new ArrayList<>();
        if(pRoot==null) return res;
        Deque<TreeNode> s1 = new LinkedList<>();
        Deque<TreeNode> s2 = new LinkedList<>();
        s1.push(pRoot);
        while(true){
            if(s1.isEmpty() && s2.isEmpty()) break;
            if(!s1.isEmpty()){//如果s1不为null,则s1出栈的同时将其左右节点先后入s2
                while(!s1.isEmpty()){
                    TreeNode temp = s1.poll();
                    item.add(temp.val);
                    if(temp.left!=null) s2.push(temp.left);
                    if(temp.right!=null) s2.push(temp.right);
                }
                res.add(new ArrayList(item));//s1出栈完毕即这一行都打印完成
                item.clear();
            }else{
                while(!s2.isEmpty()){//如果s2不为null,则s2出栈的同时将其右左节点先后入s1
                    TreeNode temp = s2.poll();
                    item.add(temp.val);
                    if(temp.right!=null) s1.push(temp.right); 
                    if(temp.left!=null) s1.push(temp.left);
                }
                res.add(new ArrayList(item));//s2出栈完毕即这一行都打印完成
                item.clear();
            }
        }
        return res;
    }
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务