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; } };
标签:Node,right,val,next,116,指针,节点,left From: https://www.cnblogs.com/WTSRUVF/p/16651482.html