Leetcode:填充同一层的兄弟节点 II

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/junbujianwpl/article/details/83178047

Leetcode:填充同一层的兄弟节点 II

 

给定一个二叉树

struct TreeLinkNode {
  TreeLinkNode *left;
  TreeLinkNode *right;
  TreeLinkNode *next;
}

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

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

说明:

  • 你只能使用额外常数空间。
  • 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

示例:

给定二叉树,

     1
   /  \
  2    3
 / \    \
4   5    7

调用你的函数后,该二叉树变为:

     1 -> NULL
   /  \
  2 -> 3 -> NULL
 / \    \
4-> 5 -> 7 -> NULL

解法一:先层序遍历,然后修改next指针,不符合空间要求

遍历各层,前节点指向后节点。

    void connect(TreeLinkNode *root) {
        if(NULL ==root) return;

        vector<vector<TreeLinkNode*> > vec=layerTravel(root);
        for(auto i:vec){
            for(int j=0;j+1<i.size();++j){
                i[j]->next=i[j+1];
            }
        }
        
    }
    
    vector<vector<TreeLinkNode*> > layerTravel(TreeLinkNode* root){
        vector<vector<TreeLinkNode*> > res;
        if(root==NULL) return res;
        
        queue<TreeLinkNode*> que;
        que.push(root);
        while(!que.empty()){
            
            queue<TreeLinkNode*> que2;
            vector<TreeLinkNode*> vec;
            
            while(!que.empty()){
                
                auto first=que.front();
                que.pop();
                if(first==NULL) continue;
                
                vec.push_back(first);
                if(first->left)  que2.push(first->left);
                if(first->right) que2.push(first->right);
            }
            if(!vec.empty())    res.push_back(vec);
            
            que2.swap(que);
        }
        return res;
        
    }

 

解法二:一边层序遍历一边修改next指针,符合空间要求

思路:同时使用两层,上一层默认认为next指针为已经设置好,下一层为当前要修改next指针的层。用一个头指针来记录下层的开始节点,用一个前兄弟指针保存下层前一未修改next指针的节点。当root=root->next导致root变为NULL时表示换层,换层时将root指向下层头指针的下一节点,前兄弟指针指向头指针。

    void connect(TreeLinkNode *root) {
        if(NULL ==root) return;
        
        TreeLinkNode dummy(-1),*prev=&dummy;
        while(root){
            if(root->left){
                prev->next=root->left;
                prev=root->left;
            }
            
            if(root->right){
                prev->next=root->right;
                prev=root->right;
            }
            
            root=root->next;
            //换层
            if(!root){
                root=dummy.next;
                dummy.next=NULL;
                prev=&dummy;
            }
        }
    }

 

 

 

展开阅读全文

没有更多推荐了,返回首页