题目描述
试了下其他同学的解法,速度上并不会比我这种快,基本上是一致的
最底下2个是我这种解法
JAVA 代码
public class 分行从上往下打印二叉树 {
class NodeHolder{
TreeNode node;
int layer;
public NodeHolder(TreeNode node, int layer) {
this.node = node;
this.layer = layer;
}
@Override
public String toString() {
return "NodeHolder{" +
"node=" + node +
", layer=" + layer +
'}';
}
}
public List<List<Integer>> printFromTopToBottom(TreeNode root) {
if (root == null){
return new ArrayList<>();
}
ArrayList<NodeHolder> list = new ArrayList<>();
Queue<NodeHolder> queue = new LinkedList<>();
queue.add(new NodeHolder(root,0));
while (!queue.isEmpty()){
NodeHolder holder = queue.poll();
list.add(holder);
if (holder.node.left != null){
queue.add(new NodeHolder(holder.node.left,holder.layer + 1));
}
if (holder.node.right != null){
queue.add(new NodeHolder(holder.node.right,holder.layer + 1));
}
}
// list的最后一个元素的layer属性就是高度
List<List<Integer>> res = new ArrayList<>();
for (int i = 0; i <= list.get(list.size() - 1).layer; i ++){
List<Integer> temp = new ArrayList<>();
// 右到左打印
// 考虑到用迭代器遍历并删除已经遍历过的节点会使用system.arraycopy,反而性能下降,因此将其置为-1
//
if (i % 2 == 1){
for (int j = list.size() - 1; j >= 0; j--) {
if (list.get(j).layer == i){
temp.add(list.get(j).node.val);
list.get(j).layer = -1;
}
}
}else {
for (int j = 0; j < list.size(); j++){
if (list.get(j).layer == i){
temp.add(list.get(j).node.val);
list.get(j).layer = -1;
}
}
}
res.add(temp);
}
return res;
}
}