JZ77 按之字形顺序打印二叉树(中)

描述

给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)

数据范围:0≤n≤1500,树上每个节点的val满足 ∣val∣<=100
要求:空间复杂度:O(n),时间复杂度:O(n)

例如:
给定的二叉树是{1,2,3,#,#,4,5}

该二叉树之字形层序遍历的结果是

[

[1],

[3,2],

[4,5]

]

示例1

输入:{1,2,3,#,#,4,5}

返回值:[[1],[3,2],[4,5]]

说明:如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。

示例2

输入:{8,6,10,5,7,9,11}

返回值:[[8],[10,6],[5,7,9,11]]

示例3

输入:{1,2,3,4,5}

返回值:[[1],[3,2],[4,5]]

 

解法:利用两个栈,分别存奇数层和偶数层的数据。

import java.util.ArrayList;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.Stack;
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
//      stack1存奇数层,stack2存偶数层
        Stack<TreeNode> stack1 = new Stack<>();
        Stack<TreeNode> stack2 = new Stack<>();
//      根节点为空直接返回
        if(pRoot == null){
            return result;
        }
        ArrayList<Integer> list = new ArrayList<>();
        stack1.push(pRoot);
        while(!stack1.isEmpty() || !stack2.isEmpty()){
            
            while(!stack1.isEmpty()){
                TreeNode node = stack1.peek();
                int val = node.val;
                list.add(val);
//              偶数层,从左往右存
                if(node.left != null){
                    stack2.push(node.left);
                }
                if(node.right != null){
                    stack2.push(node.right);
                }
                stack1.pop();
            }
//          若该层数据不为空,则存储result,并重新为list再赋值
            if(!list.isEmpty()){
                result.add(list);
                list = new ArrayList<>();
            }
            
            while(!stack2.isEmpty()){
                TreeNode node = stack2.peek();
                int val = node.val;
                list.add(val);
//                 奇数层,从右到左存
                if(node.right != null){
                    stack1.push(node.right);
                }
                if(node.left != null){
                    stack1.push(node.left);
                }
                stack2.pop();
            }
            if(!list.isEmpty()){
                result.add(list);
                list = new ArrayList<>();
            }
        }
        return result;
    }

}

おすすめ

転載: blog.csdn.net/weixin_47465999/article/details/121479443