Computer >> Máy Tính >  >> Lập trình >> C ++

C ++ hoán đổi cặp theo cặp nút lá trong cây nhị phân

Cho một cây nhị phân. Nhiệm vụ là hoán đổi từng cặp các nút lá, chẳng hạn -

Đầu vào -

C ++ hoán đổi cặp theo cặp nút lá trong cây nhị phân

Đầu ra -

C ++ hoán đổi cặp theo cặp nút lá trong cây nhị phân

Chúng tôi sẽ theo dõi hai con trỏ trỏ đến hai nút lá liền kề và hoán đổi giá trị của chúng trong bài toán đã cho.

Phương pháp tiếp cận để tìm giải pháp

Trong cách tiếp cận này, chúng tôi đi ngang cây, tìm các nút lá và theo dõi bộ đếm của chúng tôi để kiểm tra số lượng hiện tại. Bí quyết chính là bộ đếm của chúng tôi là kỳ lạ, vì vậy con trỏ đầu tiên của chúng tôi trỏ đến nút đó ngay bây giờ. Khi bộ đếm của chúng tôi trở nên đồng đều, chúng tôi hoán đổi dữ liệu và do đó các nút lá của chúng tôi được hoán đổi.

Ví dụ

Mã C ++ cho phương pháp tiếp cận trên

#include <bits/stdc++.h>
using namespace std;
struct Node{ // structure of our tree node
    int data;
    struct Node *left, *right;
};
void Swap(Node **a, Node **b){ // the swapping utility function
    Node * temp = *a;
    *a = *b;
    *b = temp;
}
/********Pointers for leaf nodes for swapping********/
Node **firstleaf;
Node **secondleaf;
void SwapTheLeafNodes(Node **root, int &count){//recursive function for
//Swapping leaf nodes
    if (!(*root)) // if root is null we return
        return;
    if(!(*root)->left &&!(*root)->right){ // condition for leaf node
        secondleaf = root; // now we firstly make our second pointer point to this node
        count++; // we also increment the count
        if (count%2 == 0) // now if our count is even that means we have a pair so we can swap them
            Swap(firstleaf, secondleaf);
        else // if count is odd so that means we only got first node yet
            firstleaf = secondleaf;
    }
    if ((*root)->left)
        SwapTheLeafNodes(&(*root)->left, count);
    if ((*root)->right)
        SwapTheLeafNodes(&(*root)->right, count);
}
Node* newNode(int data){ // function for initializing new node
    Node *temp = new Node;
    temp->data = data;
    temp->left = temp->right = NULL;
    return temp;
}
void printInorder(Node* node){ // inorder traversal function
    if (node == NULL)
       return;
    printInorder(node->left);
    printf("%d ", node->data);
    printInorder(node->right);
}
int main(){
   /* Creating binary tree*/
    Node *root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->right->left = newNode(5);
    root->right->right = newNode(8);
    root->right->left->left = newNode(6);
    root->right->left->right = newNode(7);
    root->right->right->left = newNode(9);
    root->right->right->right = newNode(10);
    cout << "Inorder traversal before swap:\n";
    printInorder(root);
    cout << "\n";
    int count = 0; // out counter for keeping track of leaf nodes
    SwapTheLeafNodes(&root, count); // swapping the nodes
    cout << "Inorder traversal after swap:\n";
    printInorder(root);
    cout << "\n";
    return 0;
}

Đầu ra

Inorder traversal before swap:
4 2 1 6 5 7 3 9 8 10
Inorder traversal after swap:
6 2 1 4 5 9 3 7 8 10

Giải thích về Quy tắc trên

Trong cách tiếp cận trên, chúng tôi chỉ đơn giản là tạo ra hai con trỏ sẽ theo dõi các nút lá của chúng tôi. Chúng ta đi ngang qua cây khi gặp một nút lá. Đầu tiên, chúng tôi làm cho con trỏ thứ hai trỏ đến nút đó, bây giờ chúng tôi tăng một biến đếm ngay bây giờ nếu số của chúng tôi là chẵn, vì vậy chúng tôi hoán đổi các nút và nếu số đếm là lẻ, điều đó có nghĩa là chúng tôi chỉ tìm thấy phần tử đầu tiên của cặp của chúng tôi, vì vậy chúng tôi lưu trữ giá trị đó trong con trỏ đầu tiên và đây là cách hàm của chúng tôi hoạt động.

Kết luận

Trong hướng dẫn này, chúng tôi giải quyết vấn đề về hoán đổi cặp nút lá trong cây nhị phân. Chúng tôi cũng đã học chương trình C ++ cho vấn đề này và cách tiếp cận hoàn chỉnh (Bình thường và hiệu quả) mà chúng tôi đã giải quyết vấn đề này. Chúng ta có thể viết cùng một chương trình bằng các ngôn ngữ khác như C, java, python và các ngôn ngữ khác. Chúng tôi hy vọng bạn thấy hướng dẫn này hữu ích.