重新排序二进制搜索树“就地”

阿德罗尼克斯

我想要一些有用的建议或代码来实现根据以下方式运行的程序:

  1. 从命令行上的整数序列构建二进制搜索树(按给定的顺序)

  2. 重新排序树,以便值以降序显示,即新树具有:

    • 左子树中的所有值都大于根
    • 右子树中的所有值均小于根
    • 此属性适用于树中的所有节点

重新排序必须不涉及从输入整数构建新树(我已经实现了这一点);取而代之的是,它必须简单地在同一棵树中对它们进行重新排序。

到目前为止,这是我的代码,使用了错误的方法(即制作两个单独的树并使用不同的规则插入它们)。

typedef struct node{
    int value;
    struct node *left;
    struct node *right; 
} NodeT;

NodeT *newNode(int);
NodeT *insertAscend(NodeT *, int);
NodeT *insertDescend(NodeT *, int);
void printTree(NodeT *, int);
void freeTree(NodeT *);

int main(int argc,char *argv[]){
    NodeT *t1 = NULL;
    NodeT *t2 = NULL;
    int i;
    int retval = 0;

    if(argc == 1){
        fprintf(stderr, "Usage: %s integers ...\n", argv[0]);
        retval = 1;
    }else{
        int dataGood = 1;
        for(i =1; i < argc && dataGood; i++){
            int num;
            if(sscanf(argv[i], "%d", &num) != 1){
                fprintf(stderr, "Usage: %s integers ...\n", argv[0]);
                freeTree(t1);
                freeTree(t2);
                dataGood = 0;
                retval = 1;
            }else{
                t1 = insertAscend(t1, num);
                t2 = insertDescend(t2, num);
            }
        }
        if(dataGood){
            printTree(t1, 0);

            printf("Swapped tree:\n");
            printTree(t2, 0);
            freeTree(t1);
            freeTree(t2);

        }
    }

    return retval;
}

NodeT *newNode(int v){
    NodeT *new;
    new = (NodeT *)malloc(sizeof(NodeT));
    assert(new != NULL);
    new->value = v;
    new->left = NULL;
    new->right = NULL;
    return new;
}

NodeT *insertAscend(NodeT *t, int v){
    if(t == NULL){
        t = newNode(v);
    }else if(v == t->value){
        ; // no duplicates
    }else if(v < t->value){
        t->left = insertAscend(t->left, v);
    }else if(v > t->value){
        t->right = insertAscend(t->right, v);
    }
    return t;
}

NodeT *insertDescend(NodeT *t, int v){
    if(t == NULL){
        t = newNode(v);
    }else if(v == t->value){
        ; // no duplicates
    }else if(v > t->value){
        t->left = insertDescend(t->left, v);
    }else if(v < t->value){
        t->right = insertDescend(t->right, v);
    }
    return t;
}

void printTree(NodeT *t, int depth){
    if(t != NULL){
        depth++;
        printTree(t->left, depth);
        int i;
        for(i = 1; i < depth; i++){
            putchar('\t');
        }
        printf("%d\n", t->value);
        printTree(t->right, depth);
    }
}

void freeTree(NodeT *t){
    if(t != NULL){
        freeTree(t->left);
        freeTree(t->right);
        free(t);
    }
}

我再次在寻求帮助,以方便地重新安排BST的位置,而无需创建任何新的数据结构。如果下面的代码没有为那些愿意测试的人运行,我可以提供更多的说明和一些所需的示例。我对此很感兴趣,因为我已经看到该问题在以前的公司和考试面试中使用过,似乎无法根据他们的指导方针有效地实施。

斯科特·亨特(Scott Hunter)

要重新排序树,您可以交换树中每个节点的左右子树。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

二进制搜索树-排序?

来自分类Dev

将排序的数组插入二进制搜索树

来自分类Dev

二进制搜索树C

来自分类Dev

二进制搜索树创建

来自分类Dev

二进制搜索树Haskell

来自分类Dev

二进制搜索树-插入

来自分类Dev

二进制搜索树语法

来自分类Dev

二进制搜索树-插入

来自分类Dev

二进制搜索树?算法

来自分类Dev

用二进制搜索树构建AVL树

来自分类Dev

二进制搜索和二进制搜索树之间的区别?

来自分类Dev

二进制搜索树-按两个数据项排序

来自分类Dev

并行将排序后的数组转换为二进制搜索树函数

来自分类Dev

并行将排序后的数组转换为二进制搜索树函数

来自分类Dev

二进制搜索树-在Python中搜索Fcn

来自分类Dev

在二进制搜索树中搜索Word对象

来自分类Dev

二进制搜索树是二进制最大堆的特殊情况吗?

来自分类Dev

删除二进制搜索树python中的节点

来自分类Dev

二进制搜索树中Java方法的成本

来自分类Dev

更新二进制搜索树中的数据

来自分类Dev

二进制搜索树的析构函数

来自分类Dev

查找可能的二进制搜索树的数量

来自分类Dev

从列表创建完整的二进制搜索树

来自分类Dev

在二进制搜索树中找到交换的节点

来自分类Dev

二进制搜索树预遍历,递归与循环?

来自分类Dev

Python中的二进制搜索树的深度

来自分类Dev

哈希表-使用二进制搜索树实现

来自分类Dev

二进制搜索树和AVLTree问题

来自分类Dev

例外:删除二进制搜索树中的节点