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

C ++ ทรีย่อยที่ใหญ่ที่สุดที่มีจำนวนเท่ากับ 1 และ 0 เท่ากัน


ให้ต้นไม้ไบนารี ตอนนี้ เราได้รับมอบหมายให้ค้นหาทรีย่อยที่ใหญ่ที่สุดที่มีจำนวนเท่ากับ 1 และ 0 ต้นไม้มีเพียง 0 และ 1

แนวทางในการหาแนวทางแก้ไข

ในแนวทางนี้ เราจะแทนที่โหนดทั้งหมดด้วยค่า 0 ถึง -1 การทำเช่นนี้จะทำให้โปรแกรมของเราง่ายขึ้น เนื่องจากเราต้องค้นหาทรีย่อยที่ใหญ่ที่สุดโดยมีผลรวมเท่ากับ 0

ตัวอย่าง

รหัส C++ สำหรับแนวทางข้างต้น

 #include <iostream>
using namespace std;
int maxi = -1;
struct node { // structure of our tree node
    int data;
    struct node *right, *left;
};
struct node* newnode(int key){// To create a new node
    struct node* temp = new node;
    temp->data = key;
    temp->right = NULL;
    temp->left = NULL;
    return temp;
}
void inorder(struct node* root){ // traversing the tree(not used)
    if (root == NULL)
        return;
    inorder(root->left);
    cout << root->data << endl;
    inorder(root->right);
}
// Function to return the maximum size of
// the sub-tree having an equal number of 0's and 1's
int calculatingmax(struct node* root){
    int a = 0, b = 0;
    if (root == NULL)
       return 0;
    a = calculatingmax(root->right); // right subtree
    a = a + 1; // including parent
    b = calculatingmax(root->left); // left subtree
    a = b + a; // number of nodes at current subtree
    if (root->data == 0) // if the sum of whole subtree is 0
        // If the total size exceeds
        // the current max
        if (a >= maxi)
            maxi = a;
    return a;
}
int calc_sum(struct node* root){ // updating the values at each node
    if (root != NULL){
        if (root->data == 0){      
           root->data = -1;
        }
    }
    int a = 0, b = 0;
    // If left child exists
    if (root->left != NULL)
        a = calc_sum(root->left);
    // If right child exists
    if (root->right != NULL)
        b = calc_sum(root->right);
    root->data += (a + b);
    return root->data;
}
// Driver code
int main(){
    struct node* root = newnode(1);
    root->right = newnode(0);
    root->right->right = newnode(1);
    root->right->right->right = newnode(1);
    root->left = newnode(0);
    root->left->left = newnode(1);
    root->left->left->left = newnode(1);
    root->left->right = newnode(0);
    root->left->right->left = newnode(1);
    root->left->right->left->left = newnode(1);
    root->left->right->right = newnode(0);
    root->left->right->right->left = newnode(0);
    root->left->right->right->left->left = newnode(1);
    calc_sum(root);
    calculatingmax(root);
    //  cout << "h";
    cout << maxi;
    return 0;
}

ผลลัพธ์

6

คำอธิบายของโค้ดด้านบน

ในแนวทางข้างต้น เราอัปเดตโหนดทั้งหมดที่มีค่า 0 ถึง -1 แล้วตอนนี้เราลดปัญหาของเราเพื่อค้นหาทรีย่อยที่ใหญ่ที่สุดที่มีผลรวมเท่ากับ 0 ในขณะนี้ในขณะที่อัปเดตนี้ เรายังอัปเดตโหนดทั้งหมดด้วยค่าเต็ม ความสำคัญของทรีย่อยที่รูทที่โหนดนั้น และตอนนี้เราใช้ฟังก์ชันที่สองในการคำนวณและตรวจสอบทุกโหนดที่มีค่า 0 จากนั้นจึงหาจำนวนสูงสุดของโหนดที่มีอยู่ในทรีนั้น

บทสรุป

ในบทช่วยสอนนี้ เราแก้ปัญหาเพื่อค้นหาทรีย่อยที่ใหญ่ที่สุดที่มีจำนวนเท่ากับ 1 และ 0 นอกจากนี้เรายังได้เรียนรู้โปรแกรม C++ สำหรับปัญหานี้และแนวทางที่สมบูรณ์ (ปกติ) ซึ่งเราแก้ไขปัญหานี้ เราสามารถเขียนโปรแกรมเดียวกันในภาษาอื่นๆ เช่น C, java, python และภาษาอื่นๆ เราหวังว่าคุณจะพบว่าบทช่วยสอนนี้มีประโยชน์