18.按之字形层序遍历二叉树

按之字形层序遍历二叉树

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

/*
 * @Author   helen
 * @Date     2021/4/10 9:16
 * @Descriptions
 * 题目描述
 * 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
 */

import java.util.ArrayList;
import java.util.Stack;

public class 按之子形遍历二叉树 {
    public ArrayList<ArrayList<Integer>> zigzagLevelOrder (BTreeNode<Integer> root) {
        // write code here
        ArrayList<ArrayList<Integer>> list2 = new ArrayList<>();
        if(root == null)
            return list2;

        Stack<BTreeNode<Integer>> stack[] = new Stack[2];   //用两个栈,一个存储奇数层结点,一个用来存储偶数层结点
        stack[0] = new Stack<BTreeNode<Integer>>();  //需要初始化栈,否则默认为null,则会push时报NullPointException
        stack[1] = new Stack<BTreeNode<Integer>>();
        int current = 0;
        int next = 1;
        stack[current].push(root);

        while(!stack[0].isEmpty() || !stack[1].isEmpty()){
            ArrayList<Integer> list1 = new ArrayList<>();

            while(!stack[current].isEmpty()) {
                BTreeNode<Integer> node = stack[current].pop();
                list1.add(node.data);
                if (current == 0) {         //若为偶数层,则其左子结点先入栈,右子结点后入栈,以便下一层右边的结点先遍历
                    if (node.left != null)
                        stack[next].push(node.left);
                    if (node.right != null)
                        stack[next].push(node.right);
                }
                if (current == 1) {         //若为奇数层,则其右子结点先入栈,左子结点后入栈,以便下一层左边的结点先遍历
                    if (node.right != null)
                        stack[next].push(node.right);
                    if (node.left != null)
                        stack[next].push(node.left);
                }
            }
            current = 1 - current;
            next = 1 - next;
            list2.add(list1);
        }
        return list2;
    }

    public static void main(String[] args) {
        按之子形遍历二叉树 obj = new 按之子形遍历二叉树();
        BTree<Integer> bTree = new BTree<>();
        for (int i = 0; i < 10; i++) {
            bTree.RandomCreatTree(bTree.root, i);
        }

        System.out.println("==============按之子形遍历二叉树=================");
        System.out.println(obj.zigzagLevelOrder(bTree.root).toString());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值