boolean flag1 = true ; //利用标志位来控制顺序,为true,则从左到右的顺序,为false则相反
Stack<TreeNode> s1 = new Stack<>();
Stack<TreeNode> s2 = new Stack<>(); //利用两个栈的弹栈出栈,来模拟左右顺序
ArrayList<ArrayList<Integer>> l1 = new ArrayList<>();
if(pRoot == null)
return l1;
s1.push(pRoot);
while((!s1.isEmpty()) || (!s2.isEmpty())) { //只要两个栈都不为空,则继续
TreeNode p1 = null;
if(flag1) {
p1 = s1.peek(); //当为true时,则p1位s1的栈顶元素
}else {
p1 = s2.peek(); //当为false时,则p1位s2的栈顶元素
}
if(flag1) {
ArrayList<Integer> al = new ArrayList<>(); //定义新的数组存储从s1中弹栈的元素
while(!s1.isEmpty()) {
p1 = s1.pop();
if(p1.left != null) //并且按照先左子树,后右子树的顺序把从s1弹出的元素的左子树和右子树入栈s2
s2.push(p1.left);
if(p1.right != null)
s2.push(p1.right);
al.add(p1.val);
if(s1.isEmpty())
break;
p1 = s1.peek();
}
l1.add(al); //向数组中添加此次遍历的数组
flag1 = false ; //更改标志位
}else {
ArrayList<Integer> al1 = new ArrayList<>();
while(!s2.isEmpty()) {
p1 = s2.pop();
if(p1.right != null) //并且按照先右子树,后左子树的顺序把从s2弹出的元素的左子树和右子树入栈s1
s1.push(p1.right);
if(p1.left != null)
s1.push(p1.left);
al1.add(p1.val);
if(s2.isEmpty())
break;
p1 = s2.peek();
}
l1.add(al1);
flag1 = true ;
}
}
/* for (TreeNode treeNode : al) {
l1.add(treeNode.val);
}
return l1;*/
return l1;
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
最新推荐文章于 2021-03-27 22:40:39 发布