版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
29.按之字型打印二叉树(176)
-
题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
-
思路:对于奇数层结点:需要从右往左访问结点。对于偶数层结点:需要从左往右访问结点。
奇数层结点从右往左访问结点的同时,并将其孩子结点(偶数层)压入一个空栈中(右孩子->左孩子),这样偶数层在访问的时候就是从左往右访问的该层的节点。
偶数层结点从左往右访问结点的同时,并将其孩子结点(奇数层)压入一个空栈中(左孩子->右孩子),这样奇数层在访问的时候就是从右往左访问的该层的结点。
-
代码
package _29.按之字型打印二叉树; import java.util.ArrayList; import java.util.Stack; public class PrintTreeInSpeical { public static ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList<Integer> > print = new ArrayList<ArrayList<Integer> >(); if(pRoot == null) return print; //用两个栈实现 //stack1:将父结点的孩子按顺序:左->右 进栈 Stack<TreeNode> stack1 = new Stack<>(); //stack2:将父结点的孩子按顺序:右->左 进栈 Stack<TreeNode> stack2 = new Stack<>(); TreeNode node = pRoot; stack1.push(node); while(!stack1.isEmpty() || !stack2.isEmpty()){ ArrayList<Integer> list = new ArrayList<>(); if(!stack1.isEmpty()){ while(!stack1.isEmpty()){ //获取父结点 node = stack1.peek(); //将孩子结点入栈到stack2(左->右) if(node.left != null) stack2.push(node.left); if(node.right != null) stack2.push(node.right); //父结点出栈访问 node = stack1.pop(); list.add(node.val); } } else{ while(!stack2.isEmpty()){ node = stack2.peek(); //将孩子结点入栈stack1(右->左) if(node.right != null) stack1.push(node.right); if(node.left != null) stack1.push(node.left); //父结点出栈访问 node = stack2.pop(); list.add(node.val); } } print.add(list); } return print; } public static void main(String[] args) { TreeNode root = new TreeNode(1); TreeNode node1 = new TreeNode(2); TreeNode node2 = new TreeNode(3); TreeNode node3 = new TreeNode(4); TreeNode node4 = new TreeNode(5); TreeNode node5 = new TreeNode(6); TreeNode node6 = new TreeNode(7); root.left = node1; root.right = node2; node1.left = node3; node1.right = node4; node2.left = node5; node2.right = node6; ArrayList<ArrayList<Integer>> print = Print(root); System.out.println(print); } } class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } }