在bst中找到最小的深度叶节点

时间:2011-11-04 00:03:07

标签: binary-search-tree depth

需要获取具有最小深度的叶节点。如果不在每个节点中存储其他信息,我想不出一个好方法,请非常感谢。

2 个答案:

答案 0 :(得分:2)

蛮力解是一个广度优先的搜索,终止于第一个叶子,这将比递归迭代地更容易实现。

例如,参见my answer to "Breadth First Vs Depth First"中的伪代码,只需在while循环中添加另一个条件。

BTW - 这将为您提供具有最小深度的 叶子,因为在该深度处可能有多个叶子。获得全套最小深度叶片要困难一些。我想去iterative deepening strategy


找出该节点的级别。

三种选择:

首先找到节点,然后在树下搜索它。这听起来很浪费,但是第二次搜索只需要访问与级别一样多的节点,所以它确实很快。

或者,您可以随时跟踪。您使用了三个计数器levelCounterthisLevelCounternextLevelCounter。每次你更多地对一个新节点你递减thisLevelCounter,当它达到零时你已经向下移动了一个级别所以

levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0

每次将子节点添加到搜索列表时,请递增nextLevelCounter。 每次存储新的子节点增量nextLevelCounter

最后,迭代深化策略为您提供免费的成功等级(迭代找到它......)并且具有与广度优先搜索相同的性能顺序(尽管稍高一些乘数)。

答案 1 :(得分:0)

这里的代码版本(希望我没有错过任何错误检查):

void min_leaf(node_t *t, int *min, int lev, node_t **n) {
    if (!t) {
            return;
    }   

    if (lev > *min) {
            printf("Back from %d at lev %d, min: %d already found\n",
                            t->key,
                            lev,
                            *min);
            return;
    }   

    if (!t->left && !t->right) {
            if (*min > lev) {
                    *min = lev;
                    *n = t;
            }   
    } else {
            min_leaf(t->left, min, lev+1, n); 
            min_leaf(t->right, min, lev+1, n); 
    }   
}

void bst_print_min_leaf(bst_t* bst) {
    int min = 10000; /* Replace it with some really large number */
    node_t *minn = NULL;

    min_leaf(bst->root, &min, 0, &minn); /*level: root is level 0 */
    if (minn) printf("min leaf is at depth: %d: (%p:%d)\n", min, minn, minn->key);
}