117. Populating Next Right Pointers in Each Node II

117. Populating Next Right Pointers in Each Node II


Follow up for problem “Populating Next Right Pointers in Each Node”.
What if the given tree could be any binary tree? Would your previous solution still work?
Note:
- You may only use constant extra space.
For example,
Given the following binary tree,

         1
       /  \
      2    3
     / \    \
    4   5    7

After calling your function, the tree should look like:

        1 -> NULL
       /  \
      2 -> 3 -> NULL
     / \    \
    4-> 5 -> 7 -> NULL

题目大意

相较于116. Populating Next Right Pointers in Each Node,这道题将原来的题目要求的完美二叉树泛化成一般的二叉树。同样的找出next边,以及每一层末尾的NULL

解题思路

  1. 使用BFS遍历整棵树。
  2. 116. Populating Next Right Pointers in Each Node解题思路不一样的地方在于,因为不是完美二叉树,所以在push左子树和右子树之前,要提前检查是否为空,如果为空,则不push。
  3. 如果队列头为NULL,则说明当前层已经遍历完毕,且下一层的所有子节点,已经全部在队列中,向队列push入NULL节点。
  4. 如果出现连续的NULL说明遍历结束。

算法复杂度

O(|V+E|)

代码实现

/**
 * Definition for binary tree with next pointer.
 * struct TreeLinkNode {
 *  int val;
 *  TreeLinkNode *left, *right, *next;
 *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
 * };
 */
class Solution {
public:
  void connect(TreeLinkNode *root) {
    if (root == nullptr)
      return;
    root->next = nullptr;
    queue<TreeLinkNode *> que;
    TreeLinkNode* top;
    que.push(root);
    que.push(nullptr);  // key
    // bfs
    while (!que.empty()) {
      top = que.front();
      que.pop();
      if (top != nullptr) {
        top->next = que.front();
        if (top->left != nullptr)
          que.push(top->left);
        if (top->right != nullptr)
          que.push(top->right);
      } else {
        // 如果出现连续的nullptr, 则说明bfs已经结束
        if (que.front() == nullptr) { break; }
          que.push(nullptr);  // 层结束标志
      }
    } 
  }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值