116. Populating Next Right Pointers in Each Node
Given a binary tree
struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *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
.
Note:
- You may only use constant extra space.
- You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).
For example,
Given the following perfect binary tree,
1 / \ 2 3 / \ / \ 4 5 6 7
After calling your function, the tree should look like:
1 -> NULL / \ 2 -> 3 -> NULL / \ / \ 4->5->6->7 -> NULL
题目的意思就是把二叉树的每一层节点都用 next
指针连接起来:
而且题目说了,输入是一棵「完美二叉树」,形象地说整棵二叉树是一个正三角形,除了最右侧的节点 next
指针会指向 null
,其他节点的右侧一定有相邻的节点。
这道题怎么做呢?把每一层的节点穿起来,是不是只要把每个节点的左右子节点都穿起来就行了?
我们可以模仿上一道题,写出如下代码:
Node connect(Node root) {
if (root == null || root.left == null) {
return root;
}
root.left.next = root.right;
connect(root.left);
connect(root.right);
return root;
}
这样其实有很大问题,再看看这张图:
节点 5 和节点 6 不属于同一个父节点,那么按照这段代码的逻辑,它俩就没办法被穿起来,这是不符合题意的。
回想刚才说的,二叉树的问题难点在于,如何把题目的要求细化成每个节点需要做的事情,但是如果只依赖一个节点的话,肯定是没办法连接「跨父节点」的两个相邻节点的。
那么,我们的做法就是增加函数参数,一个节点做不到,我们就给他安排两个节点,「将每一层二叉树节点连接起来」可以细化成「将每两个相邻节点都连接起来」:
class Solution { public: void connect_two(Node* root1, Node* root2){ if(root1 == NULL || root2==NULL) return; root1->next = root2; connect_two(root1->left,root1->right); connect_two(root2->left,root2->right); connect_two(root1->right,root2->left); } Node* connect(Node* root) { if(root == NULL) return NULL; connect_two(root->left,root->right); return root; } };
-------------old-----------------
默认每个节点的next 都是空。
2层循环,第一层循环是层数,用level_start控制,
第二层循环,循环每层的每个节点,来构建next 指针,
构建next指针时,有3种情况:1 左指针指向右指针
2 右指针不是当层最末尾的指针,右指针指向父亲节点next的左指针。
3
右指针是当层最末尾的指针,不用处理,因为默认每个节点的next都是指向null的。
1 public class Solution { 2 public void connect(TreeLinkNode root) { 3 TreeLinkNode level_start=root; 4 while(level_start!=null){ 5 TreeLinkNode cur=level_start; 6 while(cur!=null){ 7 if(cur.left!=null) cur.left.next=cur.right; 8 if(cur.right!=null && cur.next!=null) cur.right.next=cur.next.left; 9 10 cur=cur.next; 11 } 12 level_start=level_start.left; 13 } 14 } 15 }