【问题标题】:how to convert a given level of a binary search tree into a linked chain?如何将给定级别的二叉搜索树转换为链接链?
【发布时间】:2019-09-04 02:24:49
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以通过实现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))
    

    【讨论】:

    • 这是一个很好的解决方案,问题是我不能使用队列,我只能使用上面列出的结构或简单的结构(如数组等)。也许我可以尝试只使用列表以及我已经拥有的所有功能(例如删除第一个和最后一个)。
    • 是的,您可以将列表结构用于队列,因为它同时具有头指针和尾指针。
    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 2011-04-14
    • 2012-07-15
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    相关资源
    最近更新 更多