给定一个完美二叉树,其全部叶子节点都在同一层,每一个父节点都有两个子节点。二叉树定义以下:node
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每一个 next 指针,让这个指针指向其下一个右侧节点。若是找不到下一个右侧节点,则将 next 指针设置为 NULL。面试
初始状态下,全部 next 指针都被设置为 NULL。算法
示例:分布式
输入:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":null,"right":null,"val":4},"next":null,"right":{"$id":"4","left":null,"next":null,"right":null,"val":5},"val":2},"next":null,"right":{"$id":"5","left":{"$id":"6","left":null,"next":null,"right":null,"val":6},"next":null,"right":{"$id":"7","left":null,"next":null,"right":null,"val":7},"val":3},"val":1} 输出:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":{"$id":"4","left":null,"next":{"$id":"5","left":null,"next":{"$id":"6","left":null,"next":null,"right":null,"val":7},"right":null,"val":6},"right":null,"val":5},"right":null,"val":4},"next":{"$id":"7","left":{"$ref":"5"},"next":null,"right":{"$ref":"6"},"val":3},"right":{"$ref":"4"},"val":2},"next":null,"right":{"$ref":"7"},"val":1} 解释:给定二叉树如图 A 所示,你的函数应该填充它的每一个 next 指针,以指向其下一个右侧节点,如图 B 所示。
使用层序遍历,遍历的时候把同层的节点链接起来;函数
class Solution { public Node connect(Node root) { if (root == null) return null; Queue<Node> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()) { int size = queue.size(); Node current = null; while (size > 0) { Node node = queue.poll(); if (node.right != null) queue.add(node.right); if (node.left != null) queue.add(node.left); node.next = current; current = node; size--; } } return root; } }
递归的时候咱们一般就分解为递归子问题和递归结束条件。spa
递归子问题指针
递归结束条件code
class Solution { public Node connect(Node root) { // o(1) space. if (root == null) return null; if (root.left != null) root.left.next = root.right; if (root.right != null && root.next != null) root.right.next = root.next.left; connect(root.left); connect(root.right); return root; } }
层序遍历咱们以前用队列来作,可是有时候咱们会要求层序遍历用常数的空间复杂度来解。这种方法最关键的地方在于理解如何从上一层切换到下一层的。dummy的做用用于记录上一层的第一个节点是谁,每当遍历完一层以后,切到下一层.递归
class Solution { public Node connect(Node root) { Node dummy = new Node(0); Node pre = dummy; Node currentRoot = root; while (currentRoot != null) { if (currentRoot.left != null) { pre.next = currentRoot.left; pre = pre.next; } if (currentRoot.right != null) { pre.next = currentRoot.right; pre = pre.next; } currentRoot = currentRoot.next; if (currentRoot == null) { // 切换层. pre = dummy; currentRoot = dummy.next; dummy.next = null; } } return root; } }