我试图使用广度优先搜索来计算叶节点的最小深度。我有以下基本结构
public int BFS(Node root){
if (root == null) return 0;
Queue<Node> q = new LinkedList<Node>();
int min = 1;
q.clear(); // I saw this in a queue example, unsure if needed
q.add(root);
while (! q.isEmpty()){
Node n = q.remove();
if (n.left != null) q.add(n.left);
if (n.right != null) q.add(n.right);
}
}
我不知道在哪里更新最小高度计数器。我曾考虑过把它放在if语句中作为临时循环变量l&amp;如果左边或右边不为空,我将它们设置为1,否则为0。然后将这两个的最小值加到最小高度,但这只有在我在叶子上方的一个水平处才有效。
答案 0 :(得分:1)
这个想法应该是这样的:
distance = 1
。distance = actual node distance + 1
在伪代码中:
root.depth := 1
q := create queue
q.add(root)
while q is not empty
Node n := q.dequeue()
if (n is leaf) then
return n.depth
if (n.left is not null) then
n.left.depth := n.depth + 1
q.add(n.left)
if (n.right is not null) then
n.right.depth := n.depth + 1
q.add(n.right)
return 0
答案 1 :(得分:1)
您可以使用成对队列(节点,深度)。由于搜索是BFT,因此第一个叶子包含最小深度。
根据你的代码,算法就像那样(伪java代码):
public int BFS(Node root)
{
if (root == null)
return 0;
Queue<Pair<Node,int>> q = new LinkedList<Pair<Node,int>>();
q.add(new Pair(root, 0));
while (! q.isEmpty()) {
Pair p = q.remove();
Node n = p.getFirst();
if (n.left == null && n.right == null) // is this a leaf?
return p.getSecond(); // yes! ==> p.getSecond() is its min depth
if (n.left != null)
q.add(new Pair(n.left, p.getSecond() + 1));
if (n.right != null)
q.add(new Pair(n.right, p.getSecond() + 1));
}
}
当然,你需要Pair
课程,但我留给你这些细节
答案 2 :(得分:0)
通常在BFS中,您的节点有一个距离字段。根距离为零,然后每当您向队列添加新节点时,将其距离设置为n.distance + 1