LeetCode OJ:Populating Next Right Pointers in Each Node

Populating Next Right Pointers in Each Node

 

Given a binary tree

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

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.

Initially, all next pointers are set to NULL.

Note:

  • You may only use constant extra space.
  • You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).

For example,
Given the following perfect binary tree,

         1
       /  \
      2    3
     / \  / \
    4  5  6  7

After calling your function, the tree should look like:

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

算法思想:根据层序遍历的思想,将每一层元素链接起来,用curLev变量表示访问到当前层的第几个元素了,nextLev表示下一层多少个元素,然后用辅助结构体指针将这一层的节点相连;这里同时考虑到了任意二叉树的情况,Populating Next Right Pointers in Each Node II 也可用这答案

/**
 * 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) {
        if(!root)return;
        queue<TreeLinkNode *>que;
        TreeLinkNode *p;
        p=NULL;
        int minLen=0;
		int curLev=1;
		int nextLev=0;
        que.push(root);
        while(!que.empty()){
            TreeLinkNode *cur=que.front();
            que.pop();
            if(p==NULL)p=cur;
            else {p->next=cur;p=cur;}
            if(cur->left){que.push(cur->left);nextLev++;}
            if(cur->right){que.push(cur->right);nextLev++;}
            if(--curLev==0){
				p->next=NULL;
                p=NULL;
				curLev=nextLev;
				nextLev=0;
			}
        }
    }
};


递归版

/**
 * 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) {
        connect(root,NULL);
    }
    void connect(TreeLinkNode *root,TreeLinkNode *sibing){
        if(!root)return;
        else root->next=sibing;
        
        connect(root->left,root->right);
        if(sibing)
            connect(root->right,sibing->left);
        else 
            connect(root->right,NULL);
    }
};



你可能感兴趣的:(LeetCode)