当前位置:编程学习 > C/C++ >>

Populating Next Right Pointers in Each Node II

Obviously, the thought of this question is also disturbed by the former one. First, post the wrong code:
 
 
/** 
 * Definition for binary tree with next pointer. 
 * struct TreeLinkNode { 
 *  int val; 
 *  TreeLinkNode *left, *right, *next; 
 *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} 
 * }; 
 */  
class Solution {  
public:  
    void connect(TreeLinkNode *root) {  
        // Note: The Solution object is instantiated only once and is reused by each test case.  
        TreeLinkNode *tmp;  
        if(root==NULL)   return;  
        if(root->left!=NULL){  
            if(root->right!=NULL)  
                root->left->next=root->right;  
            else{  
                tmp=root->next;  
                while(tmp!=NULL){  
                    if(tmp->left!=NULL){  
                        root->left->next=tmp->left;  
                        break;  
                    }  
                    if(tmp->right!=NULL){  
                        root->left->next=tmp->right;  
                        break;  
                    }  
                    tmp=tmp->next;  
                }         
            }  
        }  
          
        if(root->right!=NULL){  
            tmp=root->next;  
            while(tmp!=NULL){  
                if(tmp->left!=NULL){  
                    root->right->next=tmp->left;  
                    break;  
                }  
                if(tmp->right!=NULL){  
                    root->right->next=tmp->right;  
                    break;  
                }  
                tmp=tmp->next;  
            }      
        }    
        connect(root->left);  
        connect(root->right);  
    }  
};  

 

 
 
Input: {2,1,3,0,7,9,1,2,#,1,0,#,#,8,8,#,#,#,#,7}
Output: {2,#,1,3,#,0,7,9,1,#,2,1,0,#,7,#}
Expected: {2,#,1,3,#,0,7,9,1,#,2,1,0,8,8,#,7,#}
 
Take notice that:
 
connect(root->left);  
connect(root->right);  
The traversal is DFS, therefore, the right part of some layer has been linked. For example, 0->7->9....1 has formed when visiting 7:1->0. However, the next hop of 0 couldn't be linked because 9-->1 hasn't been connected. So the  the right code is:

[cpp] view plaincopy
/** 
 * Definition for binary tree with next pointer. 
 * struct TreeLinkNode { 
 *  int val; 
 *  TreeLinkNode *left, *right, *next; 
 *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} 
 * }; 
 */  
class Solution {  
public:  
    void connect(TreeLinkNode *root) {  
        // Note: The Solution object is instantiated only once and is reused by each test case.  
        TreeLinkNode *tmp,rt,curnode;  
        if(root==NULL)   return;  
        rt=root;  
        while(rt!=NULL){  
            if(rt->left!=NULL){  
                curnode=rt->left;  
                break;  
            }  
            if(rt->right!=NULL){  
                curnode=rt->right;  
                break;  
            }  
            rt=rt->next;  
        }  
          
          
        if(root->left!=NULL){  
            if(root->right!=NULL)  
                root->left->next=root->right;  
            else{  
                tmp=root->next;  
                while(tmp!=NULL){  
                    if(tmp->left!=NULL){  
                        root->left->next=tmp->left;  
                        break;  
                    }  
                    if(tmp->right!=NULL){  
                        root->left->next=tmp->right;  
                        break;  
                    }  
                    tmp=tmp->next;  
                }         
            }  
        }  
          
        if(root->right!=NULL){  
            tmp=root->next;  
            while(tmp!=NULL){  
                if(tmp->left!=NULL){  
                    root->right->next=tmp->left;  
                    break;  
                }  
                if(tmp->right!=NULL){  
                    root->right->next=tmp->right;  
                    break;  
                }  
                tmp=tmp->next;  
            }      
        }    
          
        connect(root->right);  
        connect(root->left);  
    }  
};  

 

 
A concise code could be written as:
 
/** 
 * Definition for binary tree with next pointer. 
 * struct TreeLinkNode { 
 *  int val; 
 *  TreeLinkNode *left, *right, *next; 
 *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} 
 * }; 
 */  
class Solution {  
public:  
    void connect(TreeLinkNode *root) {  
        // Note: The Solution object is instantiated only once and is reused by each test case.  
        TreeLinkNode *rt=NULL,*nextnode=NULL;  
        if(root==NULL)   return;  
        rt=root->next;  
        while(rt!=NULL){  
            if(rt->left!=NULL){  
                nextnode=rt->left;  
                break;  
            }  
            if(rt->right!=NULL){  
                nextnode=rt->right;  
                break;  
            }  
            rt=rt->next;  
        }  
        if(root->right!=NULL){  
            root->right->next=nextnode;  
            if(root->left!=NULL)  
                root->left->next=root->right;  
        }  
        else if(root->left!=NULL)  
            root->left->next=nextnode;  
  
        connect(root->right);  
        connect(root->left);  
    }  
};  

 

 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,