package offer;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.ArrayBlockingQueue;
public class Day0324_demo02 {
/**
* 从上往下打印二叉树,层序遍历二叉树
* 思路: 使用队列存储数据。
* 1、根节点存在queue
* 2、每次取queue头数据,然后添加到list,
* 3、讲该节点的左右子节点存在queue中
*/
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
if(root == null) return null;
Queue queue = new ArrayBlockingQueue(100);
ArrayList<Integer> list = new ArrayList<>();
queue.add(root);
while(!queue.isEmpty()){
TreeNode node = (TreeNode) queue.poll();
list.add(node.val);
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
if(list.size() == 0){ new ArrayList<Integer>();}
return list;
}
public ArrayList<Integer> SprintFromToBottom(TreeNode root){
/**
* 思路:使用两个堆栈进行遍历 每一层使用一个栈进行遍历。OK
* 1、根节点存在一个栈中。
* 2、取出那个不为空的栈,然后看他们有没有左右节点。如果有的话放到另一个栈中
* 3、一次下次直到两个栈都为null。
*/
ArrayList<Integer> list = new ArrayList<>();
if(root == null) return list;
Stack s1 = new Stack();
Stack s2 = new Stack();
s1.push(root);
while(!s1.isEmpty() || !s2.isEmpty()){
while(!s1.isEmpty()){
TreeNode treeNode = (TreeNode)s1.pop();
list.add(treeNode.val);
if(treeNode.right != null) s2.push(treeNode.right);
if(treeNode.left != null) s2.push(treeNode.left);
}
while(!s2.isEmpty()){
TreeNode treeNode = (TreeNode)s2.pop();
list.add(treeNode.val);
if(treeNode.right != null) s1.push(treeNode.right);
if(treeNode.left != null) s1.push(treeNode.left);
}
}
return list;
}
}