我有一个二叉树,每个节点都可以有一个值。
我想在树中找到值为null并且最接近根的节点。如果有两个节点距根节点的距离相同,则两者都可以。我需要最小化对二叉树的读访问次数。假设工作内存仅限于k个节点。
DFS到深度k是详尽的,但除非我首先遍历整个树,否则找不到最近的节点。 BFS会找到最接近的,但它可能会失败,因为DFS可以找到具有相同内存的更深的空值。
我希望对树的读取访问次数最少,并找到最接近的空节点。
(我最终也需要在n路树中实现这一点,所以一般解决方案都会很好。没有对树的写访问权限,只需阅读。)
答案 0 :(得分:2)
我将使用简单的树修剪来实现DFS。因此,您必须运行整个树是不正确的。
例如,如果您在高度h处找到了空值,则可以跳过中的节点相同或更深的位置。
答案 1 :(得分:2)
您可能需要查看Iterative-deepening depth-first search。它会自动找到最近的节点,但能够达到与DFS相同的深度。它会使用更多的读访问。
您也可以从BFS开始,如果没有找到允许内存的null,请运行DFS。
答案 2 :(得分:1)
如果您无法更改数据结构,那么您必须先阅读每个节点 - 广度优先。
如果可以更改数据结构,则每个节点都可以记录第一个空子节点的相对深度。 (每个都根据孩子的等值来计算)。
然后你知道在寻找最早的null时树中的哪一行要追逐。
答案 3 :(得分:0)
如果您愿意将树存储在数组中,有一种简单的方法。节点n的子节点不是每个节点都有指向其左右子节点的子节点,而是数组中的2n + 1和2n + 2。 (节点n的父节点是(n-1)/ 2,如果n!= 0。)
Node tree[] = { 0, //root
1, // root's left child
2, // root's right child
3, // 1's left child
4, // 1's right child
5, // 2's left child
6, // 2's right child
...,
};
简单地线性迭代数组相当于BFS,但空间要求为O(1)。
这很容易扩展到n-ary树。例如,在三元树中,左子节点是3n + 1,中心是3n + 2,右边是3n + 3,如果n!= 0,父节点是(n-1)/ 3。