剑指offer(59)按之字形顺序打印二叉树

使用一个双端队列,具体为Java中的LinkedList结构,这个结构的底层实现就是非常纯粹的双端队列结构。

首先生成双端队列dq,将根节点从dq的头部放入dq

原则1:如果是从左到右的过程,那么一律从dq的头部弹出节点,如果弹出的节点没有孩子节点,当然不用放入任何节点到dq中,如果当前节点有孩子节点,先让左孩子从尾部进入dq,再让右孩子从尾部进入dq

原则2:如果是从右到左的过程,那么一律从dq的尾部弹出节点,如果弹出的节点没有孩子节点,当然不用放入任何节点到dq中;如果当前节点有孩子节点,先让右孩子从头部进入dq,再让左孩子从头部进入dq。

在ZigZag的打印过程中,下一层最后打印的节点是当前层有孩子的节点中最先进入dq的节点。

//用ArrayList的方法:ArrayList结构为动态数组,在这个结构中,当元素数量到一定规模时,将发生扩容操作,扩容操作的时间复杂度O(n)还是比较高的
//这个结构增加和删除元素的时间复杂度也较高,总之,用这个结构对本体来讲数据结构不够纯粹和干净,还需要两个Arraylist。
//本题用双端队列,
public class Solution {
    public void Print(TreeNode pRoot) {
        if(pRoot == null){
            return;
        }
        Deque<TreeNode> dq = new LinkedList<TreeNode>();
        boolean ltr = true;//是从左到右
        TreeNode last = pRoot;//当前层的最后一个节点
        TreeNode nLast = null;//下一层的最后一个节点
        dq.offerFirst(pRoot);
        while(!dq.isEmpty()){
            if(ltr){//从左到右打印,从头部弹出,将弹出的节点的孩子节点按照从左到右的顺序在尾部进入
                pRoot = dq.pollFirst();
                if(pRoot.left != null){
                    nLast = nLast == null ? pRoot.left : nLast;//设定下一层最后一个节点,即当前层第一个带孩子节点的第一个入队列节点
                    dq.offerLast(pRoot.left);
                }
                if(pRoot.right != null){
                    nLast = nLast == null ? pRoot.right : nLast;//如果已经设定了下一层的最后一个节点,这个就肯定不是最后一个节点
                    dq.offerLast(pRoot.right);
                }
            }else{//从右到左打印,从尾部弹出,将弹出的节点的孩子节点按照从右到左的顺序在头部插入
                pRoot = dq.pollLast();
                if(pRoot.right != null){
                    nLast = nLast == null ? pRoot.right : nLast;
                    dq.offerFirst(pRoot.right);
                }
                if(pRoot.left != null){
                    nLast = nLast == null ? pRoot.left : nLast;
                    dq.offerFirst(pRoot.left);
                }
            }
            System.out.print(pRoot.val + " ");
            if(pRoot == last && !dq.isEmpty()){//一层结束
                ltr = !ltr;//输出的顺序改变
                last = nLast;//当前层最后一个节点的指针移动到刚才设定的下一层的最后一个节点
                nLast = null;//重新初始化
                System.out.println();//换行
            }
        }
        System.out.println();
        

    }

}

猜你喜欢

转载自blog.csdn.net/qq_34403001/article/details/89412621