LC 第116题
给定一个完美二叉树,填充每一个节点的next指针。节点定义
1 2 3 4 5 6
| class Node { public int val; public Node left; public Node right; public Node next; }
|
方法一
基于广度优先搜索,不同的是,每次都取出一层的所有节点。遍历当前层数节点,将每个节点的next都指向当前队列中的节点,而最后一个指向null
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public Node connect(Node root) { if (root == null) return null; Queue<Node> queue = new LinkedList<>(); queue.offer(root); while (! queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i ++) { Node n = queue.poll(); if (i < size - 1) { Node head = queue.peek(); n.next = head; } if (n.left != null) { queue.offer(n.left); } if (n.right != null) { queue.offer(n.right); } } } return root; }
|
方法二
当前节点为根节点时,next = null;
next都是由left 指向right的,而对于第三层开始,除了left.next = right之外, right.next = 上一节点.next.left
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public Node connect(Node root) { if (root == null) return null; if (root.left != null) { root.left.next = root.right.next; if (root.next != null) { root.right.next = root.next.left; } } connect(root.left); connect(root.right); return root; }
|