Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การเติมพอยน์เตอร์ขวาถัดไปในแต่ละโหนด II ใน C++


สมมติว่าเรามีไบนารีทรี โดยที่แต่ละโหนดมีฟิลด์ต่อไปนี้ (ข้อมูล ซ้าย ขวา ถัดไป) ด้านซ้ายจะชี้ไปที่ทรีย่อยด้านซ้าย ด้านขวาจะชี้ไปที่ทรีย่อยด้านขวา และตัวชี้ถัดไปจะชี้ไปที่โหนดถัดไป หากไม่มีโหนดทางด้านขวามือ จะเป็นโมฆะ ดังนั้นในตอนแรก ตัวชี้ถัดไปแต่ละตัวจะถูกตั้งค่าเป็น null เราจะต้องสร้างลิงก์ สมมติว่าต้นไม้เป็นเหมือนต้นแรก มันจะถูกแปลงเป็นโหนดถัดไป -

การเติมพอยน์เตอร์ขวาถัดไปในแต่ละโหนด II ใน C++


การเติมพอยน์เตอร์ขวาถัดไปในแต่ละโหนด II ใน C++

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • set pre :=root, nextPre :=null and prev :=null
  • ในขณะที่ pre ไม่เป็นค่าว่าง
    • ในขณะที่ pre ไม่เป็นค่าว่าง
      • ถ้าเหลือของพรีไม่เป็นค่าว่าง
        • set next of prev :=left of pre เมื่อ prev ไม่เป็นค่าว่าง มิฉะนั้น nextPre :=left of pre
        • prev :=left of pre
      • ถ้าสิทธิ์ของพรีไม่เป็นโมฆะ
        • set next of prev :=right of pre เมื่อ prev ไม่เป็นค่าว่าง มิฉะนั้น nextPre :=right of pre
        • prev :=right of pre
    • ก่อน :=ถัดไป
    • ตั้งค่า nextPre เป็น null และนำหน้าเป็น null
  • คืนค่า null

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
#include <stack>
using namespace std;
class Node {
   public:
   int val;
   Node* left;
   Node* right;
   Node* next;
   Node() : val(0), left(NULL), right(NULL), next(NULL) {}
   Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
   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);
   Node nodeFive(5);
   Node nodeSeven(7);
   Node nodeTwo(2,&nodeFour,&nodeFive);
   Node nodeThree(3,NULL,&nodeSeven);
   Node nodeOne(1,&nodeTwo,&nodeThree);
   root = &nodeOne;
   Solution ob;
   root = ob.connect(root);
   printTree(root);
}

อินพุต

[1,2,3,4,5,null,7]
Node* root;
Node nodeFour(4);
Node nodeFive(5);
Node nodeSeven(7);
Node nodeTwo(2,&nodeFour,&nodeFive);
Node nodeThree(3,NULL,&nodeSeven);
Node nodeOne(1,&nodeTwo,&nodeThree);
root = &nodeOne;

ผลลัพธ์

[1, #, 2, 3, #, 4, 5, 7, #, ]