c - 如何在不使用递归的情况下平衡二叉搜索树与数组?

标签 c arrays iteration binary-search-tree

我的问题是:如何检查数组中的元素?如何在数组上设置循环?

这是递归代码:

Tree BuildBalancedTree(Tree T, void **array, int inf, int sup, int(*comp)(void *, void *))
{
    int mid;

    if(inf < sup)
    {
        mid = (inf + sup) / 2;

        T = insertNode_it(T, array[mid], comp);

        T = BuildBalancedTree(T, array, inf, mid, comp);
        T = BuildBalancedTree(T, array, mid + 1, sup, comp);
    }

    return T;
}

编辑: 我想我找到了解决方法:

while((Top(st) != -1) || inf <= sup){

    while(inf <= sup){
        mid = (inf + sup) / 2;
        T = insertNode_it(T, array[mid], comp);     

        /* here i'm using a stack to store the array's boundaries */
        st = push_int(st, mid + 1);
        st = push_int(st, sup);         
        sup = mid - 1;

    }

    if((sup < inf) && (Top(st) != -1)){
        sup = Top(st);
        st = pop_int(st);

        inf = Top(st);
        st = pop_int(st);
    }

}

它确实有效。 但是你认为我应该改变一些东西吗?

最佳答案

根据定义,树是一种同构数据结构。这意味着它们“重复”自己,这使得它们非常适合递归。

此外,谈到递归和归纳之间的等价性,归纳是递归的一种特殊情况,称为尾递归,其中在方法末尾只有一次递归调用。对于树来说,需要2次递归调用,这使得转换为迭代形式变得更加困难。而且,迭代形式肯定比递归形式更复杂,而且效率可能更低。

由于上面所示的原因,由于没有与在树上遍历(或执行任何操作)所需的递归等效的直接迭代,因此迭代执行此操作的一种方法是通过使用充当调用的堆栈来模拟递归“真实”递归的堆栈。

关于c - 如何在不使用递归的情况下平衡二叉搜索树与数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29831321/

相关文章:

c - 给定一个 int 偏移量 vector ,如何使用 AVX512 内部函数收集单个字节?

javascript - 将数组数组转换为 JSON 对象列表而不是 JSON 字符串

javascript - 从 map 数据结构中获取值(value)

java - 如何在不使用 java 表的 id 属性的情况下迭代表并在 <td> 标记中获取数据

c - 在 C 中传递给 execv 的参数

c - 如何在c语言中突出显示数学运算符,例如 '*' '+' '-' 等?

c - 括号前的表达式?

c - 单链表数组不会删除节点

arrays - 在 C 中,是否可以创建没有 '\0(null)' 的字符串?

R data.table 按两列分组和迭代