二叉树的层序遍历
题目
基本的层序遍历
涉及题目有 : 102 ,429 , 107
- 先把最基本的二叉树层序遍历写一下,思路就是将节点放入队列,取出时打印,在将左右节点放入队列,重复此过程直到队列为空
public class TreeNode {
int value;
TreeNode left;
TreeNode right;
public TreeNode(int value){
this.value = value;
}
}
private static void cengxuTree(TreeNode node) {
if(node == null) {
return;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(node);
while(!queue.isEmpty()) {
TreeNode poll = queue.poll();
System.out.println(poll.value);
if(poll.left != null) {
queue.add(poll.left);
}
if(poll.right != null) {
queue.add(poll.right);
}
}
}
对层序遍历扩展
扩展 :在遍历的时候同时对层进行记录或处理,核心是知道每一层结束的位置
涉及题目 :199 ,637, 515
- 我们拿最典型的199右视图来举例,其他的基本都是这个思路
思路一 : 使用map在层序遍历的时候将节点和层数保存到map中,每一层都取出要遍历的节点,这样就知道当前节点是第几层的节点
思路二 : 使用一个节点a,b分别记录当前层的最右节点和下一层的最右节点,b节点在层序遍历的时候总是获得要入队的节点,那么这一层入队完成后,b就是这一层的最后一个节点,赋值给a记录,b继续向下,这样就知道了每层的结束位置,问题解决
private static List<Integer> cengxuTree(TreeNode node) {
if(node == null) {
return new ArrayList<>();
}
Queue<TreeNode> queue = new LinkedList<>();
ArrayList<Integer> list = new ArrayList<>();
queue.add(node);
TreeNode curNode = node;
TreeNode nextNode = null;
while(!queue.isEmpty()) {
TreeNode poll = queue.poll();
System.out.println(poll.value);
if(poll.left != null) {
queue.add(poll.left);
nextNode = poll.left;
}
if(poll.right != null) {
queue.add(poll.right);
nextNode = poll.right;
}
//说明此层遍历完成
if(poll == curNode) {
list.add(poll.value);
curNode = nextNode;
}
}
return list;
}