Tree 为什么使用顺序遍历访问所有节点时镜像树不起作用?

Tree 为什么使用顺序遍历访问所有节点时镜像树不起作用?,tree,binary-tree,inorder,Tree,Binary Tree,Inorder,所以基本上我需要写一个镜像二叉树的函数。 [镜像树示例] 我的方法是:访问所有节点一次,交换左右子节点。 要遍历,我们可以使用三种遍历中的任何一种。 当我使用前序和后序时,我得到了期望的结果,但没有使用顺序 void asd(struct node* root) {if(root == NULL) return; asd(root->leftChild); struct node* t; t=root->leftChil

所以基本上我需要写一个镜像二叉树的函数。 [镜像树示例]

我的方法是:访问所有节点一次,交换左右子节点。 要遍历,我们可以使用三种遍历中的任何一种。 当我使用前序和后序时,我得到了期望的结果,但没有使用顺序

void asd(struct node* root)
    {if(root == NULL)
        return;
    asd(root->leftChild);
    struct node* t;
            t=root->leftChild;
            root->leftChild= root->rightChild;
            root->rightChild =t;
      asd(root->rightChild);
        }
我的函数用于按顺序遍历镜像。
我不明白为什么?

我认为问题在于您的遍历顺序

所以,这就是我所能预见的事情-

{if(root == NULL)
    return;
很好。然后你交换左孩子和右孩子-

struct node* t;
        t=root->leftChild;
        root->leftChild= root->rightChild;
        root->rightChild =t;
到目前为止还不错,但现在你右边的孩子变成了左边的孩子,左边的孩子变成了右边的孩子。 现在你打电话

asd(root->rightChild);
假设您正在处理右子对象,但实际上您正在再次处理左子对象,因为它已经交换了位置

解决方案将是
预排序
后排序
,这将是直截了当的。如果您热衷于使用inoder,则必须稍微调整代码。再次处理左子级,因为它最初是右子级

void asd(struct node* root)
{if(root == NULL)
    return;
asd(root->leftChild);
struct node* t;
        t=root->leftChild;
        root->leftChild= root->rightChild;
        root->rightChild =t;
asd(root->leftChild);
    }

希望这有帮助!

您从这个程序中得到了什么结果?有错误吗?在看到插入数组{27,14,35,10,19,31,42}的结果之前,我们将无法提供帮助。镜像前的预序=27 14 10 19 35 31 42,镜像后的预序=27 35 31 42 14 10 19。实际上,镜像后的预序应该是=27 35 42 31 19 10。