需要获取具有最小深度的叶节点。如果不在每个节点中存储其他信息,我想不出一个好方法,请非常感谢。
答案 0 :(得分:2)
蛮力解是一个广度优先的搜索,终止于第一个叶子,这将比递归迭代地更容易实现。
例如,参见my answer to "Breadth First Vs Depth First"中的伪代码,只需在while循环中添加另一个条件。
BTW - 这将为您提供具有最小深度的 叶子,因为在该深度处可能有多个叶子。获得全套最小深度叶片要困难一些。我想去iterative deepening strategy。
找出该节点的级别。
三种选择:
首先找到节点,然后在树下搜索它。这听起来很浪费,但是第二次搜索只需要访问与级别一样多的节点,所以它确实很快。
或者,您可以随时跟踪。您使用了三个计数器levelCounter
,thisLevelCounter
和nextLevelCounter
。每次你更多地对一个新节点你递减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);
}