请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解法1
:由题目可以看出,对树进行层序遍历,并用两个指针维护每一层的结束位置,得知每一层有哪些节点,把每一层的节点按一定规则反转加入到ans中即可。
关键点:维护last和nLast指针用来判断是否进入到下一行
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
if(pRoot==null)
return null;
ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
Queue<TreeNode> s = new LinkedList<>();
s.add(pRoot);
TreeNode last = pRoot;//当前行的最后一个节点
TreeNode nLast = null;//下一行的最后一个节点
ArrayList<Integer> list = new ArrayList<>();//保存每一行的节点
boolean reverse = false;
while(!s.isEmpty()) {
TreeNode cur = s.poll();
list.add(cur.val);
if(cur.left!=null) {
s.add(cur.left);
nLast = cur.left;
}
if(cur.right!=null) {
s.add(cur.right);
nLast = cur.right;
}
//如果到了当前行的结尾,打这一行加入ans中
if(cur==last) {
if(reverse)//是否反转
Collections.reverse(list);
reverse = !reverse;
ans.add(list);
last = nLast;//更新当前行的最后一个节点
list = new ArrayList<>();
}
}
return ans;
}
}
解法2:
上一种解法在大量数据时,每一层的reverse操作将非常花费时间,这里可以用两个栈来消除反转操作:
关键点:用s1保存奇数行,s2保存偶数行,利用栈的特性,s1中的节点按左右子节点的顺序压入s2中,s2取节点时,取出来的数即reserve后的顺序,s2压栈时先压右节点再压左节点,此时栈中的节点以逆序存放,s1取节点时又变回正序了。
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
boolean odd = true;
//s1存奇数层节点
Stack<TreeNode> s1 = new Stack<TreeNode>();
s1.push(pRoot);
//s2存偶数层节点
Stack<TreeNode> s2 = new Stack<TreeNode>();
ArrayList<ArrayList<Integer>> ans = new ArrayList<ArrayList<Integer>>();
if(pRoot==null)
return ans;
while (!s1.empty() || !s2.empty()) {
//如果是奇数层
if(odd) {
ArrayList<Integer> list = new ArrayList<>();
while(!s1.empty()) {
TreeNode node = s1.pop();
list.add(node.val);
if(node.left!=null)
s2.push(node.left);
if(node.right!=null)
s2.push(node.right);
}
if(!list.isEmpty())
ans.add(list);
odd=!odd;
}else {
ArrayList<Integer> list = new ArrayList<>();
while(!s2.empty()) {
TreeNode node = s2.pop();
list.add(node.val);
if(node.right!=null)
s1.push(node.right);
if(node.left!=null)
s1.push(node.left);
}
if(!list.isEmpty())
ans.add(list);
odd=!odd;
}
}
return ans;
}
}