剑指offer12

题目描述

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

解题思路分析

如果需要按之字形打印二叉树话,我们其实很快就能想到用两个栈来实现
先将根节点入stack1,然后开始打印过程,当打印的奇数层的时候,将正在被打印的节点左右节点入stack2,这里得捋清楚入栈的时候到底是先入左孩子还是右孩子,从咱们这个题目来看,当再打印stack1中的节点时,由于要求方向输出,所有在将正在打印的节点的左孩子先入栈,然后再入它的右孩子,相反的,如果是在打印stack2中的节点时,应该先将正在打印的节点的右孩子先入栈,然后再入它的左孩子,还有我们需要一个标识来记录我们正在打印的是奇数层还是偶数层,这样分析下来,代码就好写了

代码实现

public ArrayList<ArrayList<Integer>> print(TreeNode pRoot) {
    if(pRoot == null) {
        return null;
    }
    ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
    //声明两个栈来存储节点
    Stack<TreeNode> stack1 = new Stack<>();
    Stack<TreeNode> stack2 = new Stack<>();
    stack1.push(pRoot);
    int layer = 1;
    while (!stack1.isEmpty() || !stack2.isEmpty()) {
        if ((layer & 1) == 1) {
            ArrayList<Integer> list = new ArrayList<>();
            while (!stack1.isEmpty()) {
                TreeNode node = stack1.pop();
                if (node != null) {
                    s2.push(node.left);
                    s2.push(node.right);
                    list.add(node.val);
                }
            }
            if (!list.isEmpty()) {
                lists.add(list);
                layer++;
            }
        }else {
            ArrayList<Integer> list = new ArrayList<>();
            while (!stack2.isEmpty()) {
                TreeNode node = stack2.pop();
                if (node != null) {
                    s1.push(node.right);
                    s1.push(node.left);
                    list.add(node.val);
                }
            }
            if (!list.isEmpty()) {
                lists.add(list);
                layer++;
            }
        }
    }
    return lists;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容