剑指offer 61题 【树】按之字形顺序打印二叉树

本文介绍了一种特殊的二叉树遍历方法——之字形打印。通过使用队列和栈,实现了按层打印的同时改变每层的输出方向。提供了完整的Java实现代码及测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
牛客传送门:点击打开链接
import java.util.*;

public class Title61 {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        // 所求结果
        ArrayList<ArrayList<Integer> > result = new ArrayList<ArrayList<Integer> >();
        if(pRoot == null)
            return result; // 这里返回的不是null
        // 每层的数据,加入result
        ArrayList<Integer> line = new ArrayList<Integer>();
        
        // 是否反转
        boolean isRotate = true;
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(pRoot);
        line.add(pRoot.val);
        result.add(line);
        
        // 用于反转
        Stack<Integer> stack = new Stack<Integer>();
        while(!queue.isEmpty()){
            // 上一层的总数
            int count = queue.size();
            // 重置
            line = new ArrayList<Integer>();
            
            if(isRotate){
                while(count-- > 0){
                    TreeNode node = queue.poll();
                    if(node.left != null){
                        queue.add(node.left);
                        stack.add(node.left.val);
                    }
                    if(node.right != null){
                        queue.add(node.right);
                        stack.add(node.right.val);
                    }
                }
                // 将栈中的数添加到line中
                while(!stack.isEmpty()){
                    line.add(stack.pop());
                }
            }else{
                while(count-- > 0){
                    TreeNode node = queue.poll();
                    if(node.left != null){
                        queue.add(node.left);
                        line.add(node.left.val);
                    }
                    if(node.right != null){
                        queue.add(node.right);
                        line.add(node.right.val);
                    }
                }
            }
            
            if(line.size() >0)
                result.add(line);
            // 下一层反转
            isRotate = !isRotate;
        }
        return result;
    }
    
    /**
     * 测试用例
     *      1
     *    2   3
     *  4  5 6  7
     * 8 9
     */
    public static void main(String[] args) {
        TreeNode a = new TreeNode(1);
        TreeNode b = new TreeNode(2);
        TreeNode c = new TreeNode(3);
        TreeNode d = new TreeNode(4);
        TreeNode e = new TreeNode(5);
        TreeNode f = new TreeNode(6);
        TreeNode g = new TreeNode(7);
        TreeNode h = new TreeNode(8);
        TreeNode i = new TreeNode(9);
        a.left = b;a.right = c;
        b.left = d;b.right = e;c.left = f;c.right = g;
        d.left = h;d.right = i;
        ArrayList<ArrayList<Integer> > result = new Title61().Print(a);
        for(ArrayList<Integer> line : result){
            System.out.println(line);
        }
        /*[1]
          [3, 2]
          [4, 5, 6, 7]
          [9, 8]
        */
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值