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

ค้นหาความสูงของต้นไม้ไบนารีพิเศษที่มีโหนดลีฟเชื่อมต่อใน C++


สมมติว่าเรามีไบนารีทรีแบบพิเศษ ซึ่งโหนดลีฟเชื่อมต่อกันเพื่อสร้างรายการที่เชื่อมโยงเป็นวงกลมแบบทวีคูณ เราต้องหาความสูงของมัน ดังนั้นตัวชี้ด้านซ้ายของลีฟส่วนใหญ่จะทำหน้าที่เป็นตัวชี้ก่อนหน้าของรายการที่เชื่อมโยงแบบวงกลมเป็นสองเท่า และตัวชี้ด้านขวาจะทำหน้าที่เป็นตัวชี้ถัดไปของรายการที่เชื่อมโยง

ในกรณีนี้ กลยุทธ์การค้นหาความสูงจะคล้ายกับแผนผังการค้นหาไบนารีปกติ เราคำนวณความสูงของทรีย่อยด้านซ้ายและขวาของโหนดซ้ำๆ และกำหนดความสูงให้กับโหนดเป็นค่าสูงสุดของโหนดลูกทั้งสอง + 1 แต่ในที่นี้ ใบไม้เป็นองค์ประกอบของรายการที่เชื่อมโยงเป็นวงกลมแบบทวีคูณ ดังนั้นสำหรับโหนดที่จะเป็นโหนดปลายสุด เราตรวจสอบว่าโหนดทางซ้ายชี้ไปที่โหนดและทางขวาชี้ไปที่โหนดเองหรือไม่

ตัวอย่าง

#include<iostream>
using namespace std;
class Node {
   public:
      int data;
      Node *left, *right;
};
bool isLeafNode(Node* node) {
   return node->left && node->left->right == node && node->right && node->right->left == node;
}
int findHeight(Node* node) {
   if (node == NULL)
      return 0;
   if (isLeafNode(node))
      return 1;
   return 1 + max(findHeight(node->left), findHeight(node->right));
}
Node* getNode(int data) {
   Node* node = new Node;
   node->data = data;
   node->left = NULL;
   node->right = NULL;
   return node;
}
int main() {
   Node* root = getNode(1);
   root->left = getNode(2);
   root->right = getNode(3);
   root->left->left = getNode(4);
   root->left->right = getNode(5);
   root->left->left->left = getNode(6);
   Node *L1 = root->left->left->left;
   Node *L2 = root->left->right;
   Node *L3 = root->right;
   L1->right = L2, L2->right = L3, L3->right = L1;
   L3->left = L2, L2->left = L1, L1->left = L3;
   cout << "Height of tree is: " << findHeight(root);
}

ผลลัพธ์

Height of tree is: 4