import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
import java.util.Stack;
/**
* 按层打印二叉树
* 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
*
*核心思路1(两个队列实现):
* 定义两个队列
* 将根节点放入第一个队列(标记为上层节点),
* 将第上层队列的子节点依次放入第二个队列(标记为下层节点)
* 上层节点全部出队列,下层栈标记为上层栈,重复以上两步骤。直至全部打印
*
*/
public class PrintTreeFromTopToBottom {
/**
* @param root TreeNode
* @return ArrayList<ArrayList<>>
*/
public static ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if(root==null){
return null;
}
Queue<TreeNode> queue_up = new ArrayDeque<>();
Queue<TreeNode> queue_low = new ArrayDeque<>();
queue_up.add(root);
TreeNode temp = null;
while (true){
ArrayList<Integer> currentLevel = new ArrayList<>();
while (!queue_up.isEmpty()){
temp = queue_up.poll();
currentLevel.add(temp.vol);
if(temp.left!=null){
queue_low.add(temp.left);
}
if (temp.right!=null){
queue_low.add(temp.right);
}
}
result.add(currentLevel);
if(queue_low.isEmpty()){
break;
}else {
while (!queue_low.isEmpty()){
queue_up.add(queue_low.poll());
}
}
}
return result;
}
//单个队列实现加一个计数器实现更好
public static ArrayList<ArrayList<Integer>> levelOrder1 (TreeNode root) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if(root==null){
return null;
}
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
TreeNode temp = null;
int count = 0;
while (!queue.isEmpty()){
ArrayList<Integer> currentLevel = new ArrayList<>();
count = queue.size();
while (count>0){
temp = queue.poll();
currentLevel.add(temp.val);
if(temp.left!=null){
queue.add(temp.left);
}
if (temp.right!=null){
queue.add(temp.right);
}
count --;
}
result.add(currentLevel);
}
return result;
}
public static void main(String[] args) {
int [] pre={1,2,4,7,3,5,6,8};
int [] in = {4,7,2,1,5,3,8,6};
TreeNode rool = ReConstructBinaryTree.reConstructBinaryTree(pre,in);
levelOrder(rool);
}
}
二叉树层遍历(双队列实现)
最新推荐文章于 2022-03-12 14:02:44 发布