我必须做一个函数,给定一个int n和一个二叉搜索树,我必须将bst int的n级转换为一个链表。
例如,如果给定数字2和此树

      2
     /  \
    5    3

我得用5-3列一个喜欢的清单
我无法到达给定的级别,然后获取该级别上的每个节点,因为如果达到该级别,我不知道如何到达下一个节点。意思是,我只能在一个分支上达到这个水平,我想不出任何递归的方法。
这是bst和链接链的结构:
struct nodo {
    info_t dato;
    nodo *anterior;
    nodo *siguiente;
};
struct rep_cadena {
    nodo *inicio;
    nodo *final;
};
struct rep_binario {
    info_t dato;
    rep_binario *izq;
    rep_binario *der;
};

这就是我想不通的功能:
cadena_t nivel_en_binario(nat l, binario_t b)

我试过用另一个我已经做过的函数来计算树的高度,但是我不能停在想要的高度上。
nat altura_binario(binario_t b) {
    if (b==NULL) return 0;
    else return maximo(altura_binario(b->izq), altura_binario(b->der))+ 1;
    }

其中最大值()返回两个给定数字之间的最高数。

最佳答案

您可以通过实现Breadth-first_search算法并稍加修改来实现这一点。您可以对(node, level)(其中node level=parent level+1)的对进行排队,而不是仅对节点进行排队,然后当进行排队时,您可以检查是否已达到所需的级别,并将其作为结果输出,而不是进一步排队。
伪代码草图:

target_level = ...read from input...

let level_nodes = ...an empty list...

let queue = ...an empty queue...
queue.enqueue((root_node, 0))

while queue is not empty:
    node, level = queue.dequeue()
    if level == target_level:
        level_nodes.append(node)
    else:
        if node has left child:
            queue.enqueue((left_child_node, level + 1))
        if node has right child:
            queue.enqueue((right_child_node, level + 1))

关于c - 如何将给定级别的二进制搜索树转换为链接链?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55666565/

10-12 23:01