zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    Spring boot核心注解
    Spring-boot配置文件
    JAVA操作Excel
    操作系统之基础
    Batch Normalization
    解决ios微信页面回退不刷新的问题
    textarea高度自适应,随着内容增加高度增加
    旋转卡 可以用做登录注册
    一个页面tab标签切换,都有scroll事件的解决办法
    input type="radio" 赋值问题
  • 原文地址:https://www.cnblogs.com/wmx24/p/9093500.html
Copyright © 2011-2022 走看看