116. 填充每个节点的下一个右侧节点指针(简单) 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
1 2 3 4 5 6 struct Node { int val; Node *left; Node *right; Node *next; }
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
进阶: 你只能使用常量级额外空间。 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
示例:
输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,’#’ 标志着每一层的结束。
提示: 树中节点的数量少于 4096 -1000 <= node.val <= 1000
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node
思路1: 层次遍历,常规思路
思路2: 算法小炒,手把手带你刷二叉树,第一期
如果是正常的写,就是root.left.next=root.right
,然后遍历,这也5无法连接到6,因为这两个不属于通过一个节点,需要添加一各节点来将所有可能情况考虑到,遍历出所有情况。
二叉树的问题难点在于,如何把题目的要求细化成每个节点需要做的事情。
代码1: 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 30 31 class Solution { public Node connect (Node root) { if (root==null ){ return root; } Queue<Node> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()){ int size = queue.size(); Node pre = null ,cur=null ; for (int i=0 ;i<size;i++){ if (i==0 ){ pre = queue.poll(); cur = pre; }else { cur = queue.poll(); pre.next = cur; pre = pre.next; } if (cur.left!=null ){ queue.add(cur.left); } if (cur.right!=null ){ queue.add(cur.right); } } } return root; } }
代码2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Solution { public Node connect (Node root) { if (root ==null ){ return null ; } connectHelper(root.left,root.right); return root; } void connectHelper (Node node1,Node node2) { if (node1 == null || node2 == null ){ return ; } node1.next=node2; connectHelper(node1.left,node1.right); connectHelper(node2.left,node2.right); connectHelper(node1.right,node2.left); } }