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

本文介绍了一种使用栈实现的二叉树之字形层序遍历算法,通过两个栈分别存储奇数层和偶数层节点,确保了遍历过程中交替输出。实例代码和步骤详细展示了如何在Java中应用这一技巧。

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

描述

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

在这里插入图片描述
输出

[[1],[3,2],[4,5]]

栈解法

用两个栈来存奇数层和偶数层的节点,如果当前为奇数层则先入栈左孩子再入栈右孩子,如果为偶数层则先入栈右孩子再入栈左孩子

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class Solution {
    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        if (pRoot == null)
            return res;
        boolean toright = true; // 向右输出
        Stack<TreeNode> stack1 = new Stack<>();
        Stack<TreeNode> stack2 = new Stack<>();
        stack1.add(pRoot);

        while (!stack1.isEmpty() || !stack2.isEmpty()) {
            ArrayList<Integer> tmp = new ArrayList<>();
            if (toright) {
            	// 向右输出 奇数层
                while (!stack1.isEmpty()) {
                    TreeNode top = stack1.pop();
                    tmp.add(top.val);
                    if (top.left != null)
                        stack2.add(top.left);
                    if (top.right != null)
                        stack2.add(top.right);
                }
                toright = false;

            } else {
            	// 向右输出 偶数层
                while (!stack2.isEmpty()) {
                    TreeNode top = stack2.pop();
                    tmp.add(top.val);
                    if (top.right != null)
                        stack1.add(top.right);
                    if (top.left != null)
                        stack1.add(top.left);
                }
                toright = true;
            }
            res.add(tmp);
        }
        return res;
    }

    public static void main(String[] args) {
        TreeNode r = new TreeNode(8);
        r.left = new TreeNode(6);
        r.right = new TreeNode(10);
        r.left.left = new TreeNode(5);
        r.left.right = new TreeNode(7);
        r.right.left = new TreeNode(9);
        r.right.right = new TreeNode(11);
        System.out.println(new Solution().Print(r));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值