剑指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> Print(TreeNode pRoot) {
		
		ArrayList> arrayListAllLevel = new ArrayList<>();
		
		if (pRoot == null) {
			return arrayListAllLevel;
		}
		//stack1暂存奇数层节点
		Stack stack1 = new Stack<>();
		//stack2暂存奇数层节点
		Stack stack2 = new Stack<>();
		//初始层次为第一层
		int level = 1;
		
		//将第1层的节点按从左到右的顺序入栈
		stack1.push(pRoot);
		
		while (!stack1.isEmpty() || !stack2.isEmpty()) {
			//保存该层中栈的元素
			ArrayList 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;
	}

}


你可能感兴趣的:(剑指offer面试题)