头条面试官问的一个问题,当时居然没写出来,难受。(树和队列练得少)
题目描述:打印从左往右看到的二叉树(就是打印每层第一个节点)
思路:按层换行打印改动一下,加个标记位解决。
按层换行打印:https://blog.csdn.net/qq_35546040/article/details/80389381
代码:
import java.util.LinkedList;
import java.util.Queue;
public class Tree {
TreeNode last;
TreeNode nlast;
public void printTree(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
last = root; //记录当前层最后一个节点
nlast = root; //记录下一层的最后一个节点
int flag = 1;
while (!queue.isEmpty()) {
TreeNode t = queue.peek();
if(flag == 1){
System.out.print(queue.poll().val + " ");
flag = 0;
}else{
queue.poll();
}
if (t.left != null) {
queue.offer(t.left);
nlast = t.left;
}
if (t.right != null) {
queue.offer(t.right);
nlast = t.right;
}
// 如果当前输出结点是最右结点,那么换行
if (last == t) {
flag = 1;
last = nlast;
}
}
}
public static void main(String[] args) {
// 构建二叉树
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.right.left = new TreeNode(5);
root.right.right = new TreeNode(6);
root.right.left.left = new TreeNode(7);
root.right.left.right = new TreeNode(8);
Tree test = new Tree();
test.printTree(root);
}
}
TreeNode 定义:
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int data,TreeNode left,TreeNode right){
this.val = data;
this.left = left;
this.right = right;
}
public TreeNode(int val){
this.val = val;
}
}
树长这样:
打印结果: