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

    示意图

  • 相关阅读:
    android 源码编译 问题 列表
    springboot总结
    设计模式学习笔记
    JWT入门1
    oauth2入门github
    mybatis面试题
    shiro入门
    knife4j swagger API文档
    pahole安装(编译)
    goMySql的逆向工程
  • 原文地址:https://www.cnblogs.com/k330/p/LeetCode_117_Populating_Next_Right_Pointers_in_Each_Node_II.html
Copyright © 2020-2023  润新知