• 116. 填充每个节点的下一个右侧节点指针


    116. 填充每个节点的下一个右侧节点指针

    给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

    struct Node {
      int val;
      Node *left;
      Node *right;
      Node *next;
    }

    填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

    初始状态下,所有 next 指针都被设置为 NULL

    示例 1:

    输入:root = [1,2,3,4,5,6,7]
    输出:[1,#,2,3,#,4,5,6,7,#]
    解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。
    

    示例 2:

    输入:root = []
    输出:[]
    

    提示:

    • 树中节点的数量在 [0, 212 - 1] 范围内
    • -1000 <= node.val <= 1000

    解析:

    标记每层第一个即可

    /*
    // Definition for a Node.
    class Node {
    public:
        int val;
        Node* left;
        Node* right;
        Node* next;
    
        Node() : val(0), left(NULL), right(NULL), next(NULL) {}
    
        Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
    
        Node(int _val, Node* _left, Node* _right, Node* _next)
            : val(_val), left(_left), right(_right), next(_next) {}
    };
    */
    
    class Solution {
    public:
        void bfs(Node*& root)
        {
            queue<pair<Node*, int> > Q;
            Q.push(pair<Node*, int> (root, 1));
            while(!Q.empty())
            {  
                pair<Node*, int> u = Q.front();
                Q.pop();
                if(!Q.empty())
                {
                    pair<Node*, int> v = Q.front();
                    if(v.second == 1) u.first->next = nullptr;
                    else u.first->next = v.first;
                }
                else u.first->next = nullptr;
                if(u.first->left)
                {
                    if(u.second == 1)
                    {
                        Q.push(pair<Node*, int> (u.first->left, 1));
                    }
                    else Q.push(pair<Node*, int> (u.first->left, 0));
                }
                if(u.first->right)
                    Q.push(pair<Node*, int> (u.first->right, 0));
            }
        }
        Node* connect(Node* root) {
            if(root == nullptr) return root;
            bfs(root);
            return root;
    
    
    
    
    
            
        }
    };
  • 相关阅读:
    两数之和
    数组,链表,跳表
    第二讲:增长全景图
    三数之和
    第一讲:增长的本质
    移动零
    八十忆双亲+师友杂记
    java:从命令行接收多个数字,求和之后输出结果
    编程的精义读后感
    java语言基础第三讲作业
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/16651482.html
Copyright © 2020-2023  润新知