二叉树的z形遍历

  public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> result = new LinkedList<>();
 
        if (root == null) {
            return result;
        }
        // 遍历标志,0表示从左到右,1表示从右到左
        int flag = 0;
        TreeNode node;
        // 记录每一层的元素
        List<Integer> lay = new LinkedList<>();
        // 双向队列,当作栈来使用,记录当前层待处理结点
        Deque<TreeNode> stack = new LinkedList<>();
        // 记录下一层待处理结点
        Deque<TreeNode> nextStack = new LinkedList<>();
 
        stack.add(root);
 
        while (!stack.isEmpty()) {
            // 删除栈顶元素
            node = stack.removeLast();
 
            // 结果入队
            lay.add(node.val);
 
            // 如果当前是从左到右遍历,按左子树右子树的顺序添加
            if (flag == 0) {
                if (node.left != null) {
                    nextStack.addLast(node.left);
                }
 
                if (node.right != null) {
                    nextStack.addLast(node.right);
                }
            }
            // 如果当前是从右到左遍历,按右子树左子树的顺序添加
            else {
                if (node.right != null) {
                    nextStack.addLast(node.right);
                }
 
                if (node.left != null) {
                    nextStack.addLast(node.left);
                }
            }
 
            // 当前层已经处理完了
            if (stack.isEmpty()) {
                Deque<TreeNode> temp = nextStack;
                nextStack = stack;  //下一个栈清空
                stack = temp;//本栈置为下一个栈
 
                // 标记下一层处理的方向
                flag = 1 - flag;
                // 保存本层结果
                result.add(lay);
                // 创建新的链表处理下一层的结果
                lay = new LinkedList<>();
            }
        }
 
        return result;
    }

 

posted @ 2021-01-05 10:26  soft.push("zzq")  Views(265)  Comments(0Edit  收藏  举报