我必须做一个函数,给定一个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/