Algorithm 通过插入镜像BST

Algorithm 通过插入镜像BST,algorithm,binary-search-tree,Algorithm,Binary Search Tree,用C编写一个函数来创建一个新的BST,它是给定树的镜像 我想到了一个解决此问题的实现,它只是从原始树复制根节点,然后通过DFS遍历发现新节点,并使用不同的比较函数将它们插入新镜像树(即,在遍历和插入节点时使用>而不是

用C编写一个函数来创建一个新的BST,它是给定树的镜像

我想到了一个解决此问题的实现,它只是从原始树复制根节点,然后通过DFS遍历发现新节点,并使用不同的比较函数将它们插入新镜像树(即,在遍历和插入节点时使用>而不是<)


我的问题是:这种方法在所有情况下都有效吗?我想是的,但我想知道是否存在我的解决方案不起作用的情况(或者是否有更好的解决方案)。

递归解决方案:镜像左和右子节点,并将它们分别指定为镜像节点的右和左子节点。下面的代码(调用mirrorTree(root)执行):


答案与gen-y-s相同,但仅限于C

    node *create_empty()
    {
            node *temp = malloc(sizeof(*temp));
            temp->left = left;
            temp->right = right;
            return temp;
    }

    node *add_detail(int value, node *left, node *right)
    {
            temp->value = value;
            temp->left = left;
            temp->right = right;
            return temp;
    }

    node *mirror(node *p)
    {
            if (p) {
                    node = create_empty();
                    node = add_detail(p->value, mirror(p->right), mirror(p->left));
            }
            return node;
    }

另外:我想,像“左右切换”这样的后期订购方式肯定能奏效,但我很好奇上面的方法是否也能奏效,你的解决方案听起来不错。B.你也可以将树“读入”一个数组,在那里进行交换(一些数学计算出什么与什么交换),然后再次构建树。这不是很节省内存,但应该很容易实现。大多数代码是脚手架。。。算法的实际核心可以写成一个语句/表达式(递归调用的行)!!
    node *create_empty()
    {
            node *temp = malloc(sizeof(*temp));
            temp->left = left;
            temp->right = right;
            return temp;
    }

    node *add_detail(int value, node *left, node *right)
    {
            temp->value = value;
            temp->left = left;
            temp->right = right;
            return temp;
    }

    node *mirror(node *p)
    {
            if (p) {
                    node = create_empty();
                    node = add_detail(p->value, mirror(p->right), mirror(p->left));
            }
            return node;
    }