116. Populating Next Right Pointers in Each Node 发表于 2021-11-20 BFS12345678910111213141516171819202122232425class Solution { public Node connect(Node root) { Queue<Node> queue = new LinkedList<>(); if (root != null) { queue.offer(root); } while (!queue.isEmpty()) { Node pre = null; for (int i = queue.size(); i > 0; i--) { Node node = queue.poll(); node.next = pre; pre = node; if (node.right != null) { queue.offer(node.right); } if (node.left != null) { queue.offer(node.left); } } } return root; }} Iterate123456789101112131415161718192021222324252627class Solution { public Node connect(Node root) { if (root == null) { return null; } Node leftmost = root; while (leftmost.left != null) { // 存在下层节点 Node node = leftmost; while (node != null) { // 处理该层所有节点 node.left.next = node.right; if (node.next != null) { // 最右侧节点的 next 为空 node.right.next = node.next.left; } node = node.next; } leftmost = leftmost.left; } return root; }} Iterate12345678910111213141516171819202122232425262728293031class Solution { public Node connect(Node root) { if (root == null) { return null; } Node leftmost = root; while (leftmost != null) { Node dummyHead = new Node(); Node pre = dummyHead; Node node = leftmost; while (node != null) { if (node.left != null) { pre.next = node.left; pre = pre.next; } if (node.right != null) { pre.next = node.right; pre = pre.next; } node = node.next; } leftmost = dummyHead.next; } return root; }} Recursion1234567891011121314151617181920212223class Solution { public Node connect(Node root) { if (root == null) { return null; } connect(root.left, root.right); return root; } private void connect(Node nodeA, Node nodeB) { if (nodeA == null || nodeB == null) { return; } nodeA.next = nodeB; connect(nodeA.left, nodeA.right); connect(nodeB.left, nodeB.right); connect(nodeA.right, nodeB.left); }} Reference116. Populating Next Right Pointers in Each Node