之字形打印二叉树

101 阅读1分钟
package com.justalk.javademo.leetcode;

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

/**
 * 之字形打印二叉树
 * 1
 * 23
 * 4567
 * 8.。。15
 *
 * 1 3 2 4567 15.。。8
 */
public class Printer {

    public static void main(String[] args) {
        TreeNode treeNode1 = new TreeNode(1);
        TreeNode treeNode2 = new TreeNode(2);
        TreeNode treeNode3 = new TreeNode(3);
        TreeNode treeNode4 = new TreeNode(4);
        TreeNode treeNode5 = new TreeNode(5);
        TreeNode treeNode6 = new TreeNode(6);
        TreeNode treeNode7 = new TreeNode(7);
        TreeNode treeNode8 = new TreeNode(8);
        TreeNode treeNode9 = new TreeNode(9);
        TreeNode treeNode10 = new TreeNode(10);
        TreeNode treeNode11 = new TreeNode(11);
        TreeNode treeNode12 = new TreeNode(12);
        TreeNode treeNode13 = new TreeNode(13);
        TreeNode treeNode14 = new TreeNode(14);
        TreeNode treeNode15 = new TreeNode(15);

        treeNode1.left = treeNode2;
        treeNode1.right = treeNode3;

        treeNode2.left = treeNode4;
        treeNode2.right = treeNode5;

        treeNode3.left = treeNode6;
        treeNode3.right = treeNode7;

        treeNode4.left = treeNode8;
        treeNode4.right = treeNode9;

        treeNode5.left = treeNode10;
        treeNode5.right = treeNode11;

        treeNode6.left = treeNode12;
        treeNode6.right = treeNode13;

        treeNode7.left = treeNode14;
        treeNode7.right = treeNode15;

        ArrayList<ArrayList<Integer>> print = print(treeNode1);
        print.stream().forEach(System.out::println);
    }

    public static class TreeNode {

        public TreeNode(int val ) {
            this.val = val;
        }
        int val;
        TreeNode left;
        TreeNode right;
    }

    public static ArrayList<ArrayList<Integer>> print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        if (pRoot == null) return list;//注意考虑到空元素,并且此时返回list,不是null
        Stack<TreeNode> stack1 = new Stack<>();
        Stack<TreeNode> stack2 = new Stack<>();
        stack2.add(pRoot);
        while (!stack2.isEmpty() || !stack1.isEmpty()) {
            ArrayList<Integer> subList = new ArrayList<>();
            if (!stack2.isEmpty()) {
                while (!stack2.isEmpty()) {
                    TreeNode curNode = stack2.pop();
                    subList.add(curNode.val);
                    if (curNode.left != null) stack1.add(curNode.left);
                    if (curNode.right != null) stack1.add(curNode.right);
                }
                list.add(subList);
            } else {
                while (!stack1.isEmpty()) {
                    TreeNode curNode1 = stack1.pop();
                    subList.add(curNode1.val);
                    if (curNode1.right != null) stack2.add(curNode1.right);
                    if (curNode1.left != null) stack2.add(curNode1.left);
                }
                list.add(subList);
            }
        }
        return list;
    }
}