方法a:トラバーサルシーケンス(愚かな方法で、より暴力的です)
問題解決のアイデア:
各層を横断するように配列Zheke完全バイナリツリートラバーサル訪問は、2つのスタックではなく、2つのキューを使用して、本明細書で使用するとき、次のポインタを指定することがより便利であるように、インナーループことに留意されたいです一時的なスタックs2は、その後、右の子を押して左の子をプッシュすることです。S2ノードのために反転されるので、S1に順次ポップ。
/*
// 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 == NULL) return root;
//层序遍历
stack<Node*> s1;
s1.push(root);
while(!s1.empty()){
stack<Node*> s2;
Node* temp1 = NULL;
Node* temp2 = NULL;
while(!s1.empty()){
temp1 = s1.top();
s1.pop();
temp1->next = temp2;
temp2 = temp1;
if(temp1->left){
s2.push(temp1->right);
s2.push(temp1->left);
}
}
//s2中节点顺序是反过来的
while(!s2.empty()){
s1.push(s2.top());
s2.pop();
}
}
return root;
}
};
方法2:スキルベース
問題解決のアイデア:
それは完璧なバイナリツリーですので、ノードのために、その右の子に直接その左の子ノードポイントへの次のポインタであるため、次の親ノードの左の子ノードを指す右の子ノードポインタ、もし次の親ノードポインタがNULLである場合、次の右の子ノードは、ヌル点。
しかし、再帰的な時間のかかるメモリああ!
/*
// 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 == NULL) return root;
if(root->left) root->left->next = root->right;
if(root->right) {
if(root->next) root->right->next = root->next->left;
}
root->left = connect(root->left);
root->right = connect(root->right);
return root;
}
};