如何将给定级别的二进制搜索树转换为链接链?

时间:2019-04-13 14:28:30

标签: c linked-list binary-search-tree nodes

我必须执行一个函数,给定一个int n和一个二进制搜索树,我必须转换第一个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;
    }

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

2 个答案:

答案 0 :(得分:0)

您可以通过实现Breadth-first_search算法并进行一些修改来做到这一点。您可以将成对的(node, 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))

答案 1 :(得分:0)

Adivino,Tarea 3 Programacion 2 Fingjajaja,estamos en la misma,pudiste solucionarlo?