zoukankan      html  css  js  c++  java
  • LeetCode 117. Populating Next Right Pointers in Each Node II

    原题地址

    大意是,给定二叉树的每个节点都有一个next指针,希望能遍历一遍二叉树使每个节点的next指针指向其同一级的右侧节点(最右侧节点的next指针始终置为空)

    如:

             1
           /  
          2    3
         /     
        4   5    7

    变换后:

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

    基本思路是按层序遍历(BFS)来设置指针。因为有next指针的存在,遍历每层时,该层的next指针已经在上一层设置好,所以只需按照next指向的顺序遍历该层即可。只需常量空间。代码及解释如下:

     1 using namespace std;
     2 
     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         TreeLinkNode *parentLevelPtr = root;
    13         TreeLinkNode *pseudoNode = new TreeLinkNode(0);
    14         TreeLinkNode *childLevelHead, *childLevelPtr;
    15         // 分别为父子层节点准备两套指针,父节点层指针parentLevelPtr按父节点层的next指针往后走。
    16         for(; parentLevelPtr != NULL; pseudoNode->next = NULL){ // 每次循环结束需要重置pseudoNode的next指针,否则遍历到叶子节点层时循环无法结束
    17             // 子节点层两个指针childLevelHead和childLevelPtr,初始置为指向一个虚拟节点。使用虚拟节点的好处是不用在循环体内判断是否需要给head赋值。
    18             childLevelPtr = childLevelHead = pseudoNode;
    19             for(; parentLevelPtr; parentLevelPtr = parentLevelPtr->next){
    20                 // 父节点指针每移动一次,判断父节点是否有左右儿子,若有则将childLevelPtr的next置为此儿子节点,并将childLevelPtr移至next。
    21                 if(parentLevelPtr->left){
    22                     childLevelPtr->next = parentLevelPtr->left;
    23                     childLevelPtr = childLevelPtr->next;
    24                 }
    25                 
    26                 if(parentLevelPtr->right){
    27                     childLevelPtr->next = parentLevelPtr->right;
    28                     childLevelPtr = childLevelPtr->next;
    29                 }
    30             }
    31             // 父层遍历完毕,将父层节点指向儿子层继续下一轮
    32             parentLevelPtr = childLevelHead->next;
    33         }
    34         delete pseudoNode;
    35     }
    36 };

    示意图

  • 相关阅读:
    【持续更新】dp优化浅谈:实现篇
    【持续更新】dp优化浅谈:理论篇
    利用普通生成函数解斐波那契数列的通项问题
    【讲稿】动态规划基础4
    多项式板子(待完善)
    快速傅里叶变换学习笔记
    非阻塞同步算法实战(四)- 计数器定时持久化
    您还有心跳吗?超时机制分析(java)
    [分享]正则文本替换器(已开源)
    MySql大表分页(附独门秘技)
  • 原文地址:https://www.cnblogs.com/k330/p/LeetCode_117_Populating_Next_Right_Pointers_in_Each_Node_II.html
Copyright © 2011-2022 走看看