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 };

 

posted @ 2018-05-26 16:36  FlyingWarrior  阅读(599)  评论(0编辑  收藏  举报