题目描述

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

解题思路

1,用两个栈来实现,stack1存放奇数行的,stack2存放偶数行的
2,stack1先push右子节点后push左子节点,stack2反之
3,交替打印和push

代码实现

package 二叉树;

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

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

    public ArrayList<ArrayList<Integer>> IntPrint(TreeNode pRoot) {

    Stack<TreeNode> stack1 = new Stack<TreeNode>();// 存放奇数层的所有元素
    Stack<TreeNode> stack2 = new Stack<TreeNode>();// 存放偶数层的所有元素
    ArrayList<ArrayList<Integer>> listall = new ArrayList<ArrayList<Integer>>(); // 总的集合元素
        stack1.push(pRoot);
        int level = 1; // 从第一层开始
        while (!stack1.isEmpty() || !stack2.isEmpty()) {  //这里是易错点条件一定要加!
            if (level % 2 != 0) { // 如果当前层是奇数层
                ArrayList<Integer> list = new ArrayList<Integer>();
                while (!stack1.isEmpty()) {
                    TreeNode current = stack1.pop();
                    if (current != null) {
                        list.add(current.val);
                        //System.out.print(current.val + " ");
                        if (current.left != null) { //偶数层是先放左节点
                            stack2.push(current.left);
                        }
                        if (current.right != null) {
                            stack2.push(current.right);
                        }
                    }
                }
                if (!list.isEmpty()) {
                    listall.add(list);
                    level++;   //变为偶数层
                    System.out.println();
                }
            } else {
                ArrayList<Integer> list = new ArrayList<Integer>();
                while (!stack2.isEmpty()) {
                    TreeNode current = stack2.pop();
                    if (current != null) {
                        list.add(current.val);
                        System.out.print(current.val + " ");

                        if (current.right != null) {           //奇数层是先放右节点
                            stack1.push(current.right);
                        }
                        if (current.left != null) {
                            stack1.push(current.left);
                        }
                    }
                }
                if (!list.isEmpty()) {
                    listall.add(list);
                    level++;
                    System.out.println();
                }
            }

        }
        return listall;
    }

    public static void main(String[] args) { } } 

易错点

当两个栈都为空的时候应该跳出循环不再加入listall