剑指offer面试题61 按之字形顺序打印二叉树(java实现)

解题思路:

利用两个栈stack1和stack2,stack1暂存奇数层的节点,stack2暂存偶数层的节点。当stack1中节点即奇数层节点出栈时,存入一个当前层次的arraylist中,与此同时,判断该节点是否有左、右子节点,若有,则在stack2中先压入左子节点,后压入右子节点,这样做是为了满足之字形顺序这个条件。当stack1中所有节点都出栈时,将当前层的arraylist加入到一个存放所有层的arraylist中,然后将层次level加1。当stack2中节点即偶数层节点出栈时,步骤和stack1类似,只是在stack1中先压入右子节点,再压入左子节点。

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

class TreeNode {
	int val = 0;
	TreeNode left = null;
	TreeNode right = null;

	public TreeNode(int val) {
		this.val = val;

	}

}

public class Solution {

	public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
		
		ArrayList<ArrayList<Integer>> arrayListAllLevel = new ArrayList<>();
		
		if (pRoot == null) {
			return arrayListAllLevel;
		}
		//stack1暂存奇数层节点
		Stack<TreeNode> stack1 = new Stack<>();
		//stack2暂存奇数层节点
		Stack<TreeNode> stack2 = new Stack<>();
		//初始层次为第一层
		int level = 1;
		
		//将第1层的节点按从左到右的顺序入栈
		stack1.push(pRoot);
		
		while (!stack1.isEmpty() || !stack2.isEmpty()) {
			//保存该层中栈的元素
			ArrayList<Integer> arrayListlevel = new ArrayList<>();
			//判断是哪一个栈进行出栈操作
			if (level % 2 == 1) {
				//当奇数层执行出栈操作时
				//如果stack1还存在元素,则继续出栈
				while ( !stack1.isEmpty()) {
					TreeNode node = stack1.pop();
					//出栈同时加入到奇数层次的数组中
					arrayListlevel.add(node.val);
					//在出栈的同时,将此节点的左右子节点入stack2
					//同时存入另一个栈的顺序是先存左子节点,再存右子节点
					
					if (node.left != null) {
						stack2.push(node.left);
					}
					if (node.right != null) {
						stack2.push(node.right);
					}
					
				}
				level++;
				//stack1中所有元素出栈完毕后,将奇数层次的所有元素加入到整个线性表中
				arrayListAllLevel.add(arrayListlevel);
			} else {
				//stack2执行出栈操作
				//当偶数层执行出栈操作时
				//如果stack2还存在元素,则继续出栈
				while ( !stack2.isEmpty()) {
					TreeNode node = stack2.pop();
					//出栈同时加入到奇数层次的数组中
					arrayListlevel.add(node.val);
					//在出栈的同时,将此节点的左右子节点入stack1
					//同时存入另一个栈的顺序是先存右子节点,再存左子节点
					if (node.right != null) {
						stack1.push(node.right);
					}
					if (node.left != null) {
						stack1.push(node.left);
					}
					
				}
				level++;
				//stack2中所有元素出栈完毕后,将偶数层次的所有元素加入到整个线性表中
				arrayListAllLevel.add(arrayListlevel);
			}
		}
		
		return arrayListAllLevel;
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值