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

โปรแกรมพิมพ์ leaf to leaf path ที่ยาวที่สุดใน Binary tree โดยใช้ C++


ในบทช่วยสอนนี้ เราจะพูดถึงโปรแกรมเพื่อพิมพ์เส้นทางที่ยาวที่สุดจากโหนดปลายสุดไปยังโหนดปลายสุดอื่นในไบนารีทรีที่กำหนด

กล่าวอีกนัยหนึ่ง เราต้องพิมพ์โหนดทั้งหมดที่ปรากฏในเส้นผ่านศูนย์กลางของต้นไม้ไบนารี ในที่นี้ เส้นผ่านศูนย์กลาง (หรือความกว้าง) สำหรับไบนารีทรีหนึ่งๆ ถูกกำหนดให้เป็นจำนวนโหนดในเส้นทางที่ยาวที่สุดจากโหนดปลายด้านหนึ่งไปยังอีกโหนดหนึ่ง

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

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   Node *left, *right;
};
struct Node* create_node(int data){
   struct Node* node = new Node;
   node->data = data;
   node->left = node->right = NULL;
   return (node);
}
int tree_height(Node* root, int& ans, Node*(&k), int& lh, int& rh, int& f){
   if (root == NULL)
      return 0;
   int left_tree_height = tree_height(root->left, ans, k, lh, rh, f);
   int right_tree_height = tree_height(root->right, ans, k, lh, rh, f);
   if (ans < 1 + left_tree_height + right_tree_height){
      ans = 1 + left_tree_height + right_tree_height;
      k = root;
      lh = left_tree_height;
      rh = right_tree_height;
   }
   return 1 + max(left_tree_height, right_tree_height);
}
void print_roottonode(int ints[], int len, int f){
   int i;
   if (f == 0){
      for (i = len - 1; i >= 0; i--) {
         printf("%d ", ints[i]);
      }
   }
   else if (f == 1) {
      for (i = 0; i < len; i++) {
         printf("%d ", ints[i]);
      }
   }
}
void print_pathr(Node* node, int path[], int pathLen, int max, int& f){
   if (node == NULL)
   return;
   path[pathLen] = node->data;
   pathLen++;
   if (node->left == NULL && node->right == NULL) {
      if (pathLen == max && (f == 0 || f == 1)) {
         print_roottonode(path, pathLen, f);
         f = 2;
      }
   }
   else {
      print_pathr(node->left, path, pathLen, max, f);
      print_pathr(node->right, path, pathLen, max, f);
   }
}
void calc_diameter(Node* root){
   if (root == NULL)
      return;
   int ans = INT_MIN, lh = 0, rh = 0;
   int f = 0;
   Node* k;
   int tree_height_of_tree = tree_height(root, ans, k, lh, rh, f);
   int lPath[100], pathlen = 0;
   print_pathr(k->left, lPath, pathlen, lh, f);
   printf("%d ", k->data);
   int rPath[100];
   f = 1;
   print_pathr(k->right, rPath, pathlen, rh, f);
}
int main(){
   struct Node* root = create_node(12);
   root->left = create_node(22);
   root->right = create_node(33);
   root->left->left = create_node(45);
   root->left->right = create_node(57);
   root->left->right->left = create_node(26);
   root->left->right->right = create_node(76);
   root->left->left->right = create_node(84);
   root->left->left->right->left = create_node(97);
   calc_diameter(root);
   return 0;
}

ผลลัพธ์

97 84 45 22 57 26