C++ 两两交换二叉树中的叶节点

c++server side programmingprogramming

给定一棵二叉树。任务是成对交换叶节点,例如 −

输入 −

输出 −

我们将跟踪指向两个相邻叶节点的两个指针,并在给定的问题中交换它们的值。

寻找解决方案的方法

在这种方法中,我们遍历树,找到叶节点,并跟踪我们的计数器以检查当前计数。主要的技巧是我们的计数器是奇数,所以我们的第一个指针现在指向该节点。当我们的计数器变为偶数时,我们交换数据,因此我们的叶节点被交换。

示例

上述方法的 C++ 代码

#include <bits/stdc++.h>
using namespace std;
struct Node{ // 我们的树节点的结构
    int data;
    struct Node *left, *right;
};
void Swap(Node **a, Node **b){ // 交换实用函数
    Node * temp = *a;
    *a = *b;
    *b = temp;
}
/********用于交换的叶节点指针********/
Node **firstleaf;
Node **secondleaf;
void SwapTheLeafNodes(Node **root, int &count){//递归函数
//交换叶节点
    if (!(*root)) // 如果 root 为空,则返回
        return;
    if(!(*root)->left &&!(*root)->right){ // 叶节点条件
        secondleaf = root; // 现在我们首先让第二个指针指向这个节点
        count++; // 我们也增加计数
        if (count%2 == 0) // 现在如果我们的计数是偶数,这意味着我们有一对,所以我们可以交换它们
            Swap(firstleaf, secondleaf);
        else // 如果计数是奇数,这意味着我们只得到了第一个节点
            firstleaf = secondleaf;
    }
    if ((*root)->left)
          SwapTheLeafNodes(&(*root)->left, count);
    if ((*root)->right)
        SwapTheLeafNodes(&(*root)->right, count);
}
Node* newNode(int data){ // 初始化新节点的函数
    Node *temp = new Node;
    temp->data = data;
    temp->left = temp->right = NULL;
    return temp;
}
void printInorder(Node* node){ // 中序遍历函数
    if (node == NULL)
       return;
    printInorder(node->left);
    printf("%d ", node->data);
    printInorder(node->right);
}
int main(){
   /* 创建二叉树*/
    节点 *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 << "交换前中序遍历:\n";
    printInorder(root);
    cout << "\n";
    int count = 0; // 用于跟踪叶节点的输出计数器
    SwapTheLeafNodes(&root, count); // 交换节点
    cout << "交换后中序遍历:\n";
    printInorder(root);
    cout << "\n";
    return 0;
}

输出

交换前中序遍历:
4 2 1 6 5 7 3 9 8 10
交换后中序遍历:
6 2 1 4 5 9 3 7 8 10

上述代码的解释

在上述方法中,我们只是构造了两个指针来跟踪我们的叶节点。当我们遇到叶节点时,我们会遍历树。我们首先让第二个指针指向该节点,现在我们增加一个计数变量,如果计数是偶数,那么我们交换节点;如果计数是奇数,那么这意味着我们只找到了配对的第一个元素,所以我们将该值存储在第一个指针中,这就是我们的函数的工作原理。

结论

在本教程中,我们解决了二叉树中成对交换叶节点的问题。我们还学习了这个问题的 C++ 程序以及我们解决这个问题的完整方法(常规和高效)。我们可以用其他语言(如 C、java、python 和其他语言)编写相同的程序。我们希望您觉得本教程有用。


相关文章