使用 BFT 的二叉树的最小深度?
Min depth of a binary tree using BFT?
我正在尝试使用广度优先搜索找出叶节点的最小深度。我有以下基本结构
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);
}
}
我不确定在哪里更新最小高度计数器。我曾考虑过将它作为临时循环变量 l 和 r 放在 if 语句中,如果左边或右边不为空,我将它们设置为 1,否则为 0。然后将这 2 个中的最小值添加到最小高度,但这仅在我位于叶子上方一层时才有效。
一般在BFS中,你的节点都有一个距离场。根距离为零,那么无论何时向队列添加新节点,都将其距离设置为 n.distance+1
想法应该是这样的:
- 添加到队列的第一个节点应该有
distance = 1
.
- 对于添加到队列的新节点:
distance = actual node distance + 1
- 当您找到叶子时,您 return 实际节点距离。结束。
在伪代码中:
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
您可以使用成对的队列(节点、深度)。由于搜索是 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
class,但我把这些细节留给你
我正在尝试使用广度优先搜索找出叶节点的最小深度。我有以下基本结构
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);
}
}
我不确定在哪里更新最小高度计数器。我曾考虑过将它作为临时循环变量 l 和 r 放在 if 语句中,如果左边或右边不为空,我将它们设置为 1,否则为 0。然后将这 2 个中的最小值添加到最小高度,但这仅在我位于叶子上方一层时才有效。
一般在BFS中,你的节点都有一个距离场。根距离为零,那么无论何时向队列添加新节点,都将其距离设置为 n.distance+1
想法应该是这样的:
- 添加到队列的第一个节点应该有
distance = 1
. - 对于添加到队列的新节点:
distance = actual node distance + 1
- 当您找到叶子时,您 return 实际节点距离。结束。
在伪代码中:
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
您可以使用成对的队列(节点、深度)。由于搜索是 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
class,但我把这些细节留给你