题目
给定一个二叉树
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
示例:
输入:
{
"$id": "1",
"left": {
"$id": "2",
"left": {
"$id": "3",
"left": null,
"next": null,
"right": null,
"val": 4
},
"next": null,
"right": {
"$id": "4",
"left": null,
"next": null,
"right": null,
"val": 5
},
"val": 2
},
"next": null,
"right": {
"$id": "5",
"left": null,
"next": null,
"right": {
"$id": "6",
"left": null,
"next": null,
"right": null,
"val": 7
},
"val": 3
},
"val": 1
}
输出:
{
"$id": "1",
"left": {
"$id": "2",
"left": {
"$id": "3",
"left": null,
"next": {
"$id": "4",
"left": null,
"next": {
"$id": "5",
"left": null,
"next": null,
"right": null,
"val": 7
},
"right": null,
"val": 5
},
"right": null,
"val": 4
},
"next": {
"$id": "6",
"left": null,
"next": null,
"right": {
"$ref": "5"
},
"val": 3
},
"right": {
"$ref": "4"
},
"val": 2
},
"next": null,
"right": {
"$ref": "6"
},
"val": 1
}
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。
代码及解释
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() {}
Node(int _val, Node* _left, Node* _right, Node* _next) {
val = _val;
left = _left;
right = _right;
next = _next;
}
};
*/
class Solution {
public:
Node* connect(Node* root) {
//cellEnd记录这一层的结束节点是几号
//num记录下一层的总节点数
int cellEnd=1,num = 0;
//如果为空或者没有左右节点,返回原根节点
if(!root || (!root->left && !root->right))
return root;
vector<Node*> list ;
list.push_back(root);
//利用层次遍历的方式,给该层次非最后一个节点添加next属性
for(int i=0;i<list.size();i++){
//如果有左节点,放进去且记录下一层的节点个数
if(list[i]->left){
list.push_back(list[i]->left);
num++;
}
//如果有右节点,放进去且记录下一层的节点个数
if(list[i]->right){
list.push_back(list[i]->right);
num++;
}
//不是层结束点
if(i != (cellEnd-1)){
list[i]->next = list[i+1];
}
//是该层的结束,则改变cellEnd的值代表下一层的结束标志
//同时重置层次记录参数num
else{
cellEnd += num;
num = 0;
}
}
return root;
}
};