สมมติว่าเรามีโหนดในแผนผังการค้นหาแบบไบนารี เราต้องหาตัวต่อตามลำดับของโหนดนั้นใน BST หากไม่มีผู้สืบทอดตามลำดับ ให้คืนค่า null ดังที่เราทราบดีว่าผู้สืบทอดของโหนดคือโหนดที่มีคีย์ที่เล็กที่สุดซึ่งมากกว่าค่าของโหนด
เราจะเข้าถึงโหนดได้โดยตรง แต่จะเข้าถึงรากของต้นไม้ไม่ได้ ที่นี่แต่ละโหนดจะมีการอ้างอิงถึงโหนดหลัก ด้านล่างนี้คือคำจำกัดความของโหนด -
class Node { public int val; public Node left; public Node right; public Node parent; }
หากอินพุตเป็นแบบ −
และโหนดคือ 2 จากนั้นเอาต์พุตจะเป็น 3
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
หากสิทธิ์ของโหนดไม่เป็นโมฆะ −
-
โหนด :=ด้านขวาของโหนด
-
ขณะที่โหนดด้านซ้ายไม่เป็นโมฆะ ให้ทำ -
-
โหนด :=ด้านซ้ายของโหนด
-
-
โหนดกลับ
-
-
ในขณะที่ (พาเรนต์ของโหนดไม่เป็นโมฆะและโหนดไม่เท่ากับด้านซ้ายของพาเรนต์ของโหนด) ทำ -
-
โหนด :=พาเรนต์ของโหนด
-
-
พาเรนต์ของโหนดส่งคืน
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Node { public: int val; Node* left; Node* right; Node* parent; Node(int v, Node* par = NULL){ val = v; left = NULL; right = NULL; parent = par; } }; class Solution { public: Node* inorderSuccessor(Node* node) { if (node->right) { node = node->right; while (node->left) node = node->left; return node; } while (node->parent && node != node->parent->left) { node = node->parent; } return node->parent; } }; main(){ Solution ob; Node *root = new Node(5); root->left = new Node(3, root); root->right = new Node(6, root); root->left->left = new Node(2, root->left); root->left->right = new Node(4, root->left); root->left->left->left = new Node(1, root->left->left); cout << (ob.inorderSuccessor(root->left->left))->val; }
อินพุต
Node *root = new Node(5); root->left = new Node(3, root); root->right = new Node(6, root); root->left->left = new Node(2, root->left); root->left->right = new Node(4, root->left); root->left->left->left = new Node(1, root->left->left); (ob.inorderSuccessor(root->left->left))->val
ผลลัพธ์
3