镜像带有私有左右子树的二叉树

时间:2018-11-26 07:01:16

标签: c++ binary-tree

关于如何镜像它的信息很多,但是那些假定可以修改node-> left和node-> right,例如此功能(不是我的,是从另一个网站复制的)。

void mirror(struct Node* node) {
    if (node==NULL) return;
    else { 
        struct Node* temp; 

        /* do the subtrees */
        mirror(node->left); 
        mirror(node->right); 

        /* swap the pointers in this node */
        temp = node->left; 
        node->left  = node->right; 
        node->right = temp;
    }
}  

我知道必须有递归和基本情况(基本上是“做子树”部分),但是我不知道如何进行实际交换,因为Node是一类,左右子树是私有的(可以”)。

作为参考,这是类构造函数(没有默认构造函数)。如果它们很重要,我可以提供更多的功能(有访问器功能,但没有变异器)。它还使用模板,因此使用T。

Node(const T &x, Node *L = 0, Node *R = 0) : data(x), left(L), right(R) {}

我还做了另外两个函数(treeHeight和countNodes),不知道这是否有意义。而且我必须创建一棵新树来返回,而不是修改原始树。



注意- I 不想提供此答案,但想通知OP有关C ++语法的信息

您最初是为了实现此功能:

void mirror(struct Node* node) {
    if (node==NULL) return;
    else { 
        struct Node* temp; 

        /* do the subtrees */
        mirror(node->left); 
        mirror(node->right); 

        /* swap the pointers in this node */
        temp = node->left; 
        node->left  = node->right; 
        node->right = temp;
    }
}

C++中,将关键字struct声明为function-parameterdeclaration时,无需使用关键字variable。仅在将declaration写入structclass本身时才需要它。您可以简单地做到这一点:

void mirror(Node* node) {
    if (node==NULL) return;
    else { 
        Node* temp; 

        /* do the subtrees */
        mirror(node->left); 
        mirror(node->right); 

        /* swap the pointers in this node */
        temp = node->left; 
        node->left  = node->right; 
        node->right = temp;
    }
}  

1 个答案:

答案 0 :(得分:1)

我建议您编写自己的交换成员函数:

void swapChildren(){ 
temp = node->left; 
node->left = node->right; 
node->right = temp; 
}

这会交换左右元素。