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

本文介绍了一种使用两个栈实现之字形打印二叉树的方法。具体来说,通过两个栈分别保存奇数层和偶数层节点,并根据当前打印层的奇偶性决定子节点的压栈顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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));
			}
	 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值