今天刷到一道二叉树的题目。题目如下
首先有一个解法是很容易想到的,那就是bfs遍历,然后将每一层的节点连接起来。
代码如下
class Solution {
public:
Node* connect(Node* root) {
if(root==NULL){
return root;
}
queue<Node *> st;
st.push(root);
while(!st.empty()){
int sz = st.size();
Node *cur;
for(int i=0;i<sz;i++){
if(i==0){
cur = st.front();
}else{
cur->next = st.front();
cur = cur->next;
}
if(cur->left){
st.push(cur->left);
}
if(cur->right){
st.push(cur->right);
}
st.pop();
}
}
return root;
}
};
这个方法非常易懂且时间复杂度低,时间复杂度和空间复杂度均为O(n)。但是我们却还可以对空间复杂度进行优化。
根据题意我们可以知道。每一层的节点都是以链表的形式串联起来的,我们可以从第一层开始串起。以迭代的形式一层一层串下去。每一我们只要保存上一层的链表的头节点指针即可,根据链表的特性我们就可以得到当前层所有的节点。这样的好处是我们的空间复杂度为O(n),因为我们不需要用队列暂存每一层的节点
。时间复杂度虽然还是O(n), 但是空间复杂度为O(n);
代码如下
class Solution {
public:
Node* connect(Node* root) {
if(root==NULL){
return root;
}
Node *preHead=root;
Node *start = root->left==NULL?root->right:root->left;
while(preHead!=NULL){
start = preHead->left==NULL?preHead->right:preHead->left;
Node *tmp = start;
while(preHead!=NULL){
if(preHead->left&&preHead->left!=start){
start->next=preHead->left;
start=start->next;
}
if(preHead->right&&preHead->right!=start){
start->next=preHead->right;
start = start->next;
}
preHead=preHead->next;
}
preHead = NULL;
start = NULL;
while(tmp){
if(tmp->left==NULL&&tmp->right==NULL){
tmp=tmp->next;
}else{
break;
}
}
preHead=tmp;
}
return root;
}
};