C++の各ノードに次の右ポインタを設定する
完全な二分木があり、各ノードに次のフィールドがあるとします:(データ、左、右、次)、左は左のサブツリーを指し、右は右のサブツリーを指し、次のポインターは次のノードを指します。右側にノードがない場合、それはnullになります。したがって、最初に次の各ポインタがnullに設定され、リンクを作成する必要があります。ツリーが最初のツリーのようであるとすると、次のノードに変換されます-
これを解決するには、次の手順に従います-
- pre:=root、nextPre:=null、prev:=nullを設定します
- preがnullではない場合
- preがnullではない場合
- preの左側がnullでない場合
- prevがnullでない場合は、prevの次を:=preの左側に設定します。それ以外の場合は、nextPre:=preの左側を設定します
- prev:=preの左側
- preの権利がnullでない場合
- prevの次を設定:prevがnullでない場合はpreの権利、それ以外の場合はnextPre:=preの権利
- prev:=preの権利
- preの左側がnullでない場合
- pre:=nextPre
- nextPreをnullに設定し、prevをnullに設定
- preがnullではない場合
- nullを返す
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h>
#include <stack>
using namespace std;
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() {}
Node(int _val, Node* _left, Node* _right) {
val = _val;
left = _left;
right = _right;
next = NULL;
}
};
class Solution {
public:
Node* connect(Node* root) {
Node* pre = root;
Node* nextPre = NULL;
Node* prev = NULL;
while(pre){
while(pre){
//cout << pre->val << endl;
if(pre->left){
if(prev){
prev->next = pre->left;
}else{
nextPre = pre->left;
}
prev = pre->left;
}
if(pre->right){
if(prev){
prev->next = pre->right;
}else{
nextPre = pre->right;
}
prev = pre->right;
}
pre = pre->next;
}
//cout << "*" << endl;
pre = nextPre;
nextPre = NULL;
prev = NULL;
}
return root;
}
};
void printTree(Node* root) {
cout << "[";
if (root == NULL) return;
queue<Node*> q;
Node *curr;
q.push(root);
q.push(NULL);
while (q.size() > 1) {
curr = q.front();
q.pop();
if (curr == NULL){
q.push(NULL);
}
else {
// if(curr->next)
// q.push(curr->next);
if(curr->left)
q.push(curr->left);
if(curr->right)
q.push(curr->right);
if(curr->val == 0){
cout << "null" << ", ";
}else{
cout << curr->val << ", ";
if (curr->next == NULL) cout<<"#, ";
}
}
}
cout << "]"<<endl;
}
int main() {
Node* root;
Node nodeFour(4, NULL, NULL);
Node nodeFive(5, NULL, NULL );
Node nodeSeven(7, NULL, NULL);
Node nodeSix(6, NULL, NULL);
Node nodeTwo(2,&nodeFour,&nodeFive);
Node nodeThree(3,&nodeSix,&nodeSeven);
Node nodeOne(1,&nodeTwo,&nodeThree);
root = &nodeOne;
Solution ob;
root = ob.connect(root);
printTree(root);
} 入力
[1,2,3,4,5,6,7] Node* root; Node nodeFour(4, NULL, NULL); Node nodeFive(5, NULL, NULL ); Node nodeSeven(7, NULL, NULL); Node nodeSix(6, NULL, NULL); Node nodeTwo(2,&nodeFour,&nodeFive); Node nodeThree(3,&nodeSix,&nodeSeven); Node nodeOne(1,&nodeTwo,&nodeThree); root = &nodeOne; Solution ob; root = ob.connect(root);
出力
[1, #, 2, 3, #, 4, 5, 6, 7, #, ]
-
C++のリンクリスト内の最大値の右側のノードへのポイントアービットポインタ
この問題では、値、リンクポインター、および任意のポインターを持つリンクリストが提供されます。私たちのタスクは、リンクリストの右側にある最大値を指すように任意のポインターポイントを作成することです。 問題を理解するために例を見てみましょう ここでは、リンクリストの次の任意のポインタを見ることができます。これは、リンクリストの右側にある最大の要素を指しています。 12 -> 76, 76 -> 54, 54 -> 8, 8 -> 41 この問題を解決するには、ノードの右側にある最大の要素を見つける必要があります。このために、リンクリストを逆方向にトラバースし、す
-
C++のすべてのノードにInorderSuccessorを入力します
この問題では、ツリーが与えられます。構造体には、次にポインタが含まれています。私たちのタスクは、このポインタに順序付けられた後継者を入力することです。 ノードの。 struct node { int value; struct node* left; struct node* right; struct node* next; } 次のすべてのポインターはNULLに設定されており、ノードの順序どおりの後続ポインターにポインターを設定する必要があります。 順序のないトラバーサル −これは次