LeetCode 116/117. 填充同一层的兄弟节点(Populating Next Right Pointers in Each Node)
题目描述
给定一个二叉树
struct TreeLinkNode {
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL
。
初始状态下,所有 next 指针都被设置为 NULL
。
说明:
- 你只能使用额外常数空间。
- 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
示例:
给定完美二叉树,
1
/ \
2 3
/ \ / \
4 5 6 7
调用你的函数后,该完美二叉树变为:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ / \
4->5->6->7 -> NULL
进阶:
给定二叉树,
1
/ \
2 3
/ \ \
4 5 7
调用你的函数后,该二叉树变为:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ \
4-> 5 -> 7 -> NULL
解题思路
利用层序遍历的思想,维护一个树节点队列,同时记录本层剩余的节点数和下一层的节点数。具体来说,初始先把根节点加入到队列中,每次从队列中取出一个节点:
- 首先判断它是否有左右子节点,若有则分别将其加入到队列中,并将下一层的节点数加一
- 然后从队列中弹出该节点,并将本层剩余节点数减一
- 若本层还有剩余节点,说明此节点有同一层的兄弟节点,所以将其next指针指向队首节点
- 若剩余节点数为0,说明遍历到本层的末尾,所以将剩余节点数置为下一层的节点数,并将下一层的节点数置为0
这样遍历直到队列为空,便可将树中所有next指针指向其同层兄弟节点。
代码
1 /** 2 * Definition for binary tree with next pointer. 3 * struct TreeLinkNode { 4 * int val; 5 * TreeLinkNode *left, *right, *next; 6 * TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 void connect(TreeLinkNode *root) { 12 if(!root) return; 13 queue<TreeLinkNode*> q; 14 int nextLevel=0,remain=1; 15 q.push(root); 16 while(q.size()){ 17 TreeLinkNode *node=q.front(); 18 if(node->left){ 19 nextLevel++; 20 q.push(node->left); 21 } 22 if(node->right){ 23 nextLevel++; 24 q.push(node->right); 25 } 26 q.pop(); 27 remain--; 28 if(remain) 29 node->next=q.front(); 30 else{ 31 remain=nextLevel; 32 nextLevel=0; 33 } 34 } 35 } 36 };