原题链接:https://leetcode.com/problems/populating-next-right-pointers-in-each-node/
1. 题目介绍
You are given a perfect binary tree where all leaves are on the same level, and every parent has two children. The binary tree has the following definition:
给出一个完全二叉树,所有的树叶都在同一层,每一个父节点都有两个子节点。这个二叉树的节点是如下定义的:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.
Initially, all next pointers are set to NULL.
将每个节点的指针都指向和自己在同一层的、右侧的节点。如果节点的右侧没有节点了,那么就需要将自己的next指针设置为null。
在最初,所有节点的next指针都是null。
Example:
Explanation: Given the above perfect binary tree (Figure A), your function should populate each next pointer to point to its next right node, just like in Figure B.
给出上面的完全二叉树(图A),你的函数需要将每一个节点的next指针指向同一层的右侧节点,如同图B一样。
Note:
You may only use constant extra space.
Recursive approach is fine, implicit stack space does not count as extra space for this problem.
只可以使用常数级别的空间复杂度。
递归的解法是可以的,递归程序占用的栈空间不计算入空间复杂度。
2. 解题思路
在 https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/solution/la-la-lian-jie-fa-by-sorcerer/ 中,sorcerer提出了一种拉拉链的解法,非常巧妙,因此以下思路采用了sorcerer的解法。
可以想象,沿着树的根节点,有一根竖直的对称轴,所有节点都关于这条对称轴对称。
我们需要将每一层的所有节点中,最靠近对称轴的2个节点连接起来。需要用左侧的节点的next指针,指向右侧节点。
重复上面的步骤,就可以完成对一棵树所有节点next指针的设定了。
实现代码
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node next;
public Node() {}
public Node(int _val,Node _left,Node _right,Node _next) {
val = _val;
left = _left;
right = _right;
next = _next;
}
};
*/
class Solution {
public Node connect(Node root) {
if(root == null){
return null;
}
Node l = root.left;
Node r = root.right;
//以根节点为中心,有一条竖直的对称轴
//不断将紧邻对称轴的左侧节点的next指向右侧节点
while(l != null){
l.next = r;
l = l.right;
r = r.left;
}
connect(root.left);
connect(root.right);
return root;
}
}