剑指offer:按之字形打印二叉树(栈|双向队列+中序遍历)

时间:2023-03-08 22:50:50
剑指offer:按之字形打印二叉树(栈|双向队列+中序遍历)

1. 题目描述

/**
请实现一个函数按照之字形打印二叉树, 即第一行按照从左到右的顺序打印,
第二层按照从右至左的顺序打印,
第三行按照从左到右的顺序打印,
其他行以此类推。
*/

2. 双向队列

/*思路:利用Java中的LinkedList的底层实现是双向链表的特点。
1)可用做队列,实现树的层次遍历
2)可双向遍历,奇数层时从前向后遍历,偶数层时从后向前遍历
*/

3. 代码(双向链表+层次遍历)

import java.util.*;

public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
return levelorder(pRoot);
}
public static ArrayList<ArrayList<Integer>> levelorder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if(root == null) return result;
queue.offer(root); // 首先将根节点root入队
int level = 0;//记录层数
while (!queue.isEmpty()) {// Queue不为空则循环
LinkedList<Integer> node = new LinkedList<>();// 保存每一层节点的值
int length = queue.size();// 每一层的节点数目
while (length > 0) {
TreeNode tree = queue.poll();
if (tree.left != null) {
queue.offer(tree.left);
}
if (tree.right != null) {
queue.offer(tree.right);
}
if((level+1)%2==0){
node.addFirst(tree.val);
}else{
node.add(tree.val);
} length--;
} // node为本层遍历结果
// 将linkedlist转成 ArrayList
ArrayList<Integer> arrayNode = new ArrayList<>();
for (Integer i: node) {
arrayNode.add(i);
}
result.add(arrayNode);
//循环结束后,得到的Queue为下一层做准备,
level++;
}
return result;
}
}