Populating Next Right Pointers in Each Node - LeetCode指针
解法一:递归,DFS。由于是完美二叉树因此左子结点的next指针能够直接指向其右子节点,对于其右子节点的处理方法是,判断其父节点的next是否为空,若不为空,则指向其next指针指向的节点的左子结点,若为空则指向NULL。code
/* // 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) { if(!root) return NULL; if(root->left) { root->left->next = root->right; if(root->next) root->right->next = root->next->left; } connect(root->left); connect(root->right); return root; } };
解法二:非递归。程序遍历每层的节点都按顺序加入queue中,而每当从queue中取出一个元素时,将其next指针指向queue中下一个节点便可。blog
/* // 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) { if(!root) return NULL; queue<Node*> q; q.push(root); while(!q.empty()) { int size = q.size(); for(int i = 0;i < size;i++) { Node* temp = q.front();q.pop(); if(i != size-1) temp->next = q.front(); if(temp->left) q.push(temp->left); if(temp->right) q.push(temp->right); } } return root; } };