เราได้รับต้นไม้ไบนารี เป้าหมายคือการหารอบความยาวสูงสุดในต้นไม้ที่กำหนด เราจะทำเช่นนี้โดยการค้นหาความสูงสูงสุดของทรีย่อยด้านซ้ายและแผนผังย่อยด้านขวาจากรูทโหนด และจะเข้าร่วมเส้นทางความยาวสูงสุดเหล่านี้เพื่อให้ได้รอบที่ยาวที่สุด
สำหรับต้นไม้ด้านบน รอบความยาวสูงสุดคือ 1-2-3-4-7-6 หรือ 1-6-7-4-3-2-1 ยาว 6.
ป้อนข้อมูล − ต้นไม้
ผลผลิต − รอบความยาวสูงสุดคือ − 5
คำอธิบาย − ความสูงสูงสุดของทรีย่อยด้านซ้ายคือ 3 และทรีย่อยด้านขวาคือ 1 ความยาวของไซเคิลกลายเป็น 3+1+1=5 รอบคือ 1-2-3-4-6 หรือ 1-6-4-3-2
ป้อนข้อมูล − ต้นไม้
ผลผลิต − รอบความยาวสูงสุดคือ − 7
คำอธิบาย − ความสูงสูงสุดของทรีย่อยด้านซ้ายคือ 3 และแผนผังย่อยด้านขวาคือ 3 ความยาวของไซเคิลกลายเป็น 3+3+1=7 รอบคือ 5-4-2-1-8-7-6 หรือ 5-6-7-8-1-2-4-5
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
-
สร้างคลาส treenode ที่มีสมาชิกข้อมูลสาธารณะ − ข้อมูล int สำหรับน้ำหนักของโหนด ตัวชี้ treenode ซ้ายและขวาเพื่อชี้ไปยังโหนดอื่นๆ ดังกล่าว
-
ฟังก์ชัน newNode(int data) รับข้อมูลเป็นพารามิเตอร์และสร้างโหนดที่มีตัวชี้ซ้ายและขวาเป็น NULL
-
สร้างต้นไม้โดยเรียกใช้ฟังก์ชัน newnode()
-
ฟังก์ชัน maxheight(treenode* root) ดึงรากของต้นไม้และคืนค่าความสูงสูงสุดของต้นไม้ที่รูท
-
ฟังก์ชันนี้จะตรวจสอบว่ารูทเป็น NULL หรือไม่ หมายถึงความสูงเป็น 0 คืนค่า 0
-
lheight และ rheight คำนวณความสูงของทรีย่อยซ้ายและขวาของโหนดรูท โดยเรียกซ้ำโดยเรียก maxheight(root->left); และ maxheight(root->right);
-
ส่งคืนค่าสูงสุดที่ได้จากการเปรียบเทียบ lheight และ rheight
-
ภายใน main เราเก็บค่าความสูงสูงสุดของทรีย่อยด้านซ้ายและแผนผังย่อยด้านขวาของ treeNode
-
ตอนนี้ รอบความยาวสูงสุดคือผลรวมของทั้ง maxlheight +maxrheight+1 สำหรับการรวมรูทด้วย
-
พิมพ์ความยาวของรอบเป็นผล.
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; //class for tree class treenode{ public: int data; treenode* left; treenode* right; }; //find maximum height between left and right subtree of current root int maxheight(treenode* root){ if (root == NULL) return 0; else{ int lheight = maxheight(root->left); int rheight = maxheight(root->right); //find maximum height if (lheight > rheight) return(lheight + 1); else return(rheight + 1); } } //creating a node of tree treenode* newNode(int data){ treenode* Node = new treenode(); Node->data = data; Node->left = NULL; Node->right = NULL; return(Node); } int main(){ treenode *root = newNode(6); root->left = newNode(8); root->right = newNode(9); root->left->left = newNode(4); root->left->right = newNode(5); root->left->right->right = newNode(7); root->left->right->right->left = newNode(2); int maxlheight=maxheight(root->left); int maxrheight=maxheight(root->right); int maxlheight=maxDepth(root->left); int maxrheight=maxDepth(root->right); cout << "Maximum length cycle: " << maxlheight+maxrheight+1; return 0; }
ผลลัพธ์
Maximum length cycle: 6