ความหนาแน่นของต้นไม้ไบนารีคำนวณโดยการหารขนาดของต้นไม้ด้วยความสูง ความหนาแน่นของต้นไม้ไบนารี =ขนาด/ความสูง
ให้เรากำหนดโครงสร้างที่จะเป็นตัวแทนของโหนดต้นไม้ที่มีข้อมูลและโหนดลูกของโหนดซ้ายและขวา หากนี่เป็นโหนดแรกที่สร้างขึ้น แสดงว่าเป็นโหนดรูท มิฉะนั้นจะเป็นโหนดย่อย
struct Node { int data; struct Node *leftChild, *rightChild; };
ต่อไป เราสร้างฟังก์ชัน createNode(int data) ที่ใช้ค่า int และกำหนดให้กับสมาชิกข้อมูลของโหนด ฟังก์ชันจะส่งกลับตัวชี้ไปยังโหนดโครงสร้างที่สร้างขึ้น นอกจากนี้ ลูกซ้ายและขวาของโหนดที่สร้างขึ้นใหม่จะถูกตั้งค่าเป็นโมฆะ
Node* createNode(int data){ Node* node = new Node; node->data = data; node->leftChild = node->rightChild = NULL; return node; }
ฟังก์ชัน treeDensity(Node *root) ของเรารับโหนดรูทและตรวจสอบว่าเป็นโมฆะหรือไม่ จากนั้นจะประกาศตัวแปรขนาดและตั้งค่าเป็น 0 ค่าส่งคืนของฟังก์ชัน heightAndSize(root, size) ถูกกำหนดให้กับตัวแปรความสูง การแบ่งส่วนลอยที่ทำระหว่างความสูงและขนาดจะถูกส่งคืน
float treeDensity(Node* root){ if (root == NULL) return 0; int size = 0; int height = heightAndSize(root, size); return (float)size/height; }
ถัดไป heightAndSize(โหนดโหนด*, int &ขนาด) นำโหนดรูทและการอ้างอิงไปยังตัวแปรขนาด หากโหนดรูทเป็นโมฆะ ระบบจะส่งคืน 0 ความสูงของแผนผังย่อยแต่ละรายการจะคำนวณแบบเรียกซ้ำ และขนาดจะเพิ่มขึ้นในการเรียกซ้ำแต่ละครั้ง จากนั้นเราจะคืนค่าแผนผังย่อยด้านซ้ายหรือด้านขวาที่ใหญ่กว่า
int heightAndSize(Node* node, int &size){ if (node==NULL) return 0; int left = heightAndSize(node->leftChild, size); int right = heightAndSize(node->rightChild, size); size++; return (left > right) ? ++left : ++right; }
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อค้นหาความหนาแน่นของต้นไม้ไบนารีในการข้ามผ่านครั้งเดียว -
#include<iostream> using namespace std; struct Node{ int data; Node *leftChild, *rightChild; }; Node* createNode(int data){ Node* node = new Node; node->data = data; node->leftChild = node->rightChild = NULL; return node; } int heightAndSize(Node* node, int &size){ if (node==NULL) return 0; int left = heightAndSize(node->leftChild, size); int right = heightAndSize(node->rightChild, size); size++; return (left > right) ? ++left : ++right; } float treeDensity(Node* root){ if (root == NULL) return 0; int size = 0; int height = heightAndSize(root, size); return (float)size/height; } int main(){ Node* root = createNode(7); root->leftChild = createNode(9); root->rightChild = createNode(11); cout<< "The density of the above given binary tree is "<<treeDensity(root); return 0; }
ผลลัพธ์
รหัสข้างต้นจะสร้างผลลัพธ์ต่อไปนี้ -
The density of the above given binary tree is 1.5