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

一、题目解析

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

该题可以借助两个栈来解决问题,一个栈用来存储奇数层的节点,一个栈用来存储偶数层的节点

注意奇数层时从左到右读取,偶数层是从右到左读取,所以对应的栈存储顺序是对应相反的

二、代码

public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
    
    
        //stack1 用来存储奇数层节点
        Stack<TreeNode> stack1 = new Stack<>();
        stack1.push(pRoot);
        //stack2 用来存储偶数层节点
        Stack<TreeNode> stack2 = new Stack<>();
        //用来记录层数
        int layer = 1;
        ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
        //当两个栈均非空时,出栈入栈
        while (!stack1.empty() || !stack2.empty()) {
    
    
            ArrayList<Integer> list = new ArrayList<>();
            //奇数层节点,将下一层节点存储到 stack2 中
            if (layer % 2 != 0) {
    
    
                while (!stack1.empty()) {
    
    
                    TreeNode pop = stack1.pop();
                    if (pop != null) {
    
    
                        list.add(pop.val);
                        stack2.push(pop.left);
                        stack2.push(pop.right);
                    }
                }
            } else {
    
    
                //偶数层节点,将下一层节点存储到 stack1 中
                while (!stack2.empty()) {
    
    
                    TreeNode pop = stack2.pop();
                    if (pop != null) {
    
    
                        list.add(pop.val);
                        stack1.push(pop.right);
                        stack1.push(pop.left);
                    }
                }
            }
            if (!list.isEmpty()) {
    
    
                lists.add(list);
                layer++;
            }
        }
        return lists;
    }

三、总结

本题关键就是利用栈先进后出的特性

猜你喜欢

转载自blog.csdn.net/nanhuaibeian/article/details/108773552