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

来源:互联网 发布:逆战天梯卡数据不扣分 编辑:程序博客网 时间:2024/05/29 15:21

解题思路:

利用两个栈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
原创粉丝点击