剑指offer--61.之字形打印二叉树

题目:实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印

分析:利用两个栈来保存数据,打印某一行结点时,把下一层的子结点保存到相应的栈里,如果当前打印的是奇数层,先保存左子结点再保存右子结点;如果当前打印的是偶数层,先保存右结点,再保存左结点

代码:参考牛客大神,比较好理解

import java.util.*;
public class wr61printZhi {
	 public static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot){
		 ArrayList<ArrayList<Integer>> listall=new ArrayList<>();
		 int layer=1;//奇数偶数层记录
//		 s1存储奇数层结点,先保存左子结点,再右子结点
		 Stack<TreeNode> s1=new Stack<TreeNode>();
//		 s2存储偶数层结点,先保存右子结点,再左子结点
		 Stack<TreeNode> s2=new Stack<TreeNode>();
//		 ArrayList<Integer> list=new ArrayList<>();
		 s1.push(pRoot);
		 
		 while(!s1.isEmpty() || !s2.isEmpty()){
			 if(layer%2!=0){//奇数层
				 ArrayList<Integer> list=new ArrayList<>();
				 while(!s1.isEmpty()){
					 TreeNode temp=s1.pop();
					 if(temp!=null){
						 list.add(temp.val);
						 if(temp.left!=null){
							 s2.push(temp.left);
						 }
						 if(temp.right!=null){
							 s2.push(temp.right);
						 }
					 }
				 }
				 if(!list.isEmpty()){
					 listall.add(list);
					 layer++;
				 }
			 }
			 else{//偶数层
				 ArrayList<Integer> list=new ArrayList<>();
				 while(!s2.isEmpty()){
					 TreeNode temp=s2.pop();
					 if(temp!=null){
						 list.add(temp.val);
						 if(temp.right!=null){
							 s1.push(temp.right);
						 }
						 if(temp.left!=null){
							 s1.push(temp.left);
						 }
					 }
				 }
				 if(!list.isEmpty()){
					 listall.add(list);
					 layer++;
				 }
			 }
		 }
		 return listall;
	 }
	 public static void main(String []args){
		 TreeNode root=new TreeNode(1);
			root.left=new TreeNode(2);
			root.right=new TreeNode(3);
			root.left.left=new TreeNode(4);
			root.left.right=new TreeNode(5);
			root.right.left=new TreeNode(6);
			root.right.right=new TreeNode(7);

			ArrayList<ArrayList<Integer> > listall=Print(root);

			for(int i=0;i<listall.size();i++){
				System.out.println(listall.get(i));
			}
	 }
}

猜你喜欢

转载自blog.csdn.net/autumn03/article/details/80447542