按之字形顺序打印二叉树
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
此道题目可以跟 把二叉树打印成多行:https://www.cnblogs.com/strive-19970713/p/11205594.html 进行比较学习。
按之字形顺序打印二叉树:使用的是 栈; 出栈,入栈;先入后出,后入先出。
把二叉树打印成多行:使用的 链表;我用的方法是 固定删除编号为0 的数。
import java.util.ArrayList; import java.util.Stack; /** * * @author gentleKay * 题目描述 * 请实现一个函数按照之字形打印二叉树, * 即第一行按照从左到右的顺序打印, * 第二层按照从右至左的顺序打印, * 第三行按照从左到右的顺序打印,其他行以此类推。 */ public class Main57 { public static void main(String[] args) { TreeNode root = new TreeNode(8); root.left = new TreeNode(6); root.left.left = new TreeNode(5); root.left.right = new TreeNode(7); root.right = new TreeNode(10); root.right.left = new TreeNode(9); root.right.right = new TreeNode(11); System.out.println(Main57.Print(root)); } public static class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } public static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> aList=new ArrayList<ArrayList<Integer>>(); if(pRoot==null) return aList; Stack<TreeNode> s1=new Stack<TreeNode>(); s1.add(pRoot); Stack<TreeNode> s2=new Stack<TreeNode>(); while(!s1.isEmpty()||!s2.isEmpty()){ if(!s1.isEmpty()){ ArrayList<Integer> aList2=new ArrayList<Integer>(); while(!s1.isEmpty()){ TreeNode p=s1.pop(); aList2.add(p.val); if(p.left!=null) s2.add(p.left); if(p.right!=null) s2.add(p.right); } aList.add(aList2); } else { ArrayList<Integer> aList2=new ArrayList<Integer>(); while(!s2.isEmpty()){ TreeNode p=s2.pop(); if(p.right!=null) s1.add(p.right); if(p.left!=null) s1.add(p.left); aList2.add(p.val); } aList.add(aList2); } } return aList; } }
Stack 的相关方法:(注:图片太小,点击移动进行放大)