แนวคิด
สำหรับต้นไม้สีแดง-ดำ ความสูงที่ใหญ่ที่สุดของโหนดจะสูงเป็นสองเท่าของความสูงขั้นต่ำขั้นต่ำสำหรับต้นไม้การค้นหาไบนารีที่กำหนด เราจำเป็นต้องตรวจสอบคุณสมบัติต่อไปนี้
สำหรับโหนดทุกโหนด ความยาวของเส้นทางลีฟไปยังโหนดที่ยาวที่สุดมีไม่เกินสองเท่าของโหนดบนเส้นทางที่สั้นที่สุดจากโหนดหนึ่งไปอีกโหนดหนึ่ง
ตัวอย่าง
13 41 \ / \ 15 11 101 \ / \ 17 61 151
ต้นไม้ด้านบนไม่สามารถเป็นต้นไม้สีแดง-ดำ ต้นไม้ด้านบนสามารถเป็นต้นไม้สีแดง-ดำได้ด้วยการกำหนดสีใดๆ
ความสูงสูงสุด 13 คือ 1
ความสูงขั้นต่ำ 13 คือ 3
11 / \ 6 101 / \ 51 151 / 41
บนต้นไม้ก็สามารถเป็นต้นไม้สีแดง-ดำได้
ในกรณีนี้ ความซับซ้อนของเวลาที่คาดหวังคือ O(n) ควรเยี่ยมชมต้นไม้อย่างน้อยที่สุดหนึ่งครั้งในสารละลาย
วิธีการ
ในส่วนที่เกี่ยวกับทุกโหนด เราต้องการความสูงที่ใหญ่ที่สุดและเล็กที่สุดและเปรียบเทียบ แนวคิดคือการเยี่ยมชมต้นไม้และให้ทุกโหนดตรวจสอบว่ามีความสมดุลหรือไม่ ความต้องการของเราคือการเขียนฟังก์ชันแบบเรียกซ้ำที่ส่งคืนสามสิ่ง ค่าบูลีนเพื่อระบุว่าต้นไม้มีความสมดุลหรือไม่ ความสูงน้อยที่สุดและความสูงที่ใหญ่ที่สุด สำหรับการคืนค่าหลายค่า เราสามารถใช้โครงสร้างหรือส่งผ่านตัวแปรโดยการอ้างอิง การส่งการอ้างอิง maxh และ minhby จะดำเนินการเพื่อให้ค่าสามารถนำมาใช้ในการเรียก parent ได้
ตัวอย่าง
/* This program to check whether a given Binary Tree is balanced like a Red-Black Tree or not */ #include <bits/stdc++.h> using namespace std; struct Node1{ int key; Node1 *left, *right; }; Node1* newNode(int key){ Node1* node1 = new Node1; node1->key = key; node1->left = node1->right = NULL; return (node1); } bool isBalancedUtil(Node1 *root, int &maxh1, int &minh1){ if (root == NULL){ maxh1 = minh1 = 0; return true; } int lmxh1, lmnh1; int rmxh1, rmnh1; if (isBalancedUtil(root->left, lmxh1, lmnh1) == false) return false; if (isBalancedUtil(root->right, rmxh1, rmnh1) == false) return false; maxh1 = max(lmxh1, rmxh1) + 1; minh1 = min(lmnh1, rmnh1) + 1; if (maxh1 <= 2*minh1) return true; return false; } bool isBalanced(Node1 *root){ int maxh1, minh1; return isBalancedUtil(root, maxh1, minh1); } /* Driver program to test above functions*/ int main(){ Node1 * root = newNode(11); root->left = newNode(6); root->right = newNode(101); root->right->left = newNode(51); root->right->right = newNode(151); root->right->left->left = newNode(41); isBalanced(root)? cout << "Balanced" : cout << "Not Balanced"; return 0; }
ผลลัพธ์
Balanced