我的意思是在一个特定的水平,没有达到特定水平。 可能有人请我修改BFS算法? (其中大部分是来源于维基百科)
Queue levelorder(root, levelRequested){
int currentLevel = 0;
q = empty queue
q.enqueue(root)
while not q.empty do{
if(currentLevel==levelRequested)
return q;
node := q.dequeue()
visit(node)
if(node.left!=null || node.right!=null){
currentLevel++;
if node.left ≠ null
q.enqueue(node.left)
if node.right ≠ null
q.enqueue(node.right)
}
}
}
我认为一个递归解决方案会更简洁:
/*
* node - node being visited
* clevel - current level
* rlevel - requested level
* result - result queue
*/
drill (node, clevel, rlevel, result) {
if (clevel == rlevel) {
result.enqueue (node);
else {
if (node.left != null)
drill (node.left, clevel + 1, rlevel, result);
if (node.right != null)
drill (node.right, clevel + 1, rlevel, result);
}
}
初始调用将如下所示: drill (root, 0, n, rqueue);
与你的算法的问题是,都在同一级别的节点被错误地增加了水平计数。
说明:
根级别设置为0
当你在任何级别添加节点,设置自己的水平比他们的父母的第1级以上。
一旦你有等于您所需要的等级数,简单休息了BFS的级别数量的任何节点,并转储具有相同级别数的当前节点后面的队列中的所有节点。
详情请参阅注释。
这里是一个解决方案:
void Tree::printSameLevel(int requiredLevel) {
queue BFSQ;
TreeNode * temp;
BFSQ.push(getHead());
while(!BFSQ.empty()) {
temp = BFSQ.front();
BFSQ.pop();
//if the level of the current node is equal to the
//required level, we can stop processing now and simply
//remove from the queue all the elements that follow
//and have the same level number.
//It follows from properties of BFS that such elements
//will occur in a series ( level by level traversal).
if(temp->level == requiredLevel) {
break;
}
if(temp->right) {
BFSQ.push(temp->right);
temp->right->level = temp->level + 1;
}
if(temp->left) {
BFSQ.push(temp->left);
temp->left->level = temp->level + 1;
}
}
if(!BFSQ.empty() || requiredLevel==0) {
cout << "Printing all the nodes at level " << requiredLevel << " : ";
while(temp&&temp->level == requiredLevel) {
cout << temp->data << " ";
temp = BFSQ.front();
BFSQ.pop();
}
}
}
下面是一些示例输出:
5
7 3
8 6 4 2
TREE STATS
_____________________
Inorder Trace = 2 3 4 5 6 7 8
Height = 2
Internal Nodes = 3
Leaf Nodes = 4
Total Nodes = 7
_____________________
Trees printed above are mirrors!
Printing all the nodes at level 0 : 5
Printing all the nodes at level 1 : 7 3
如果你有兴趣,我添加了一些功能我一般树的实现在这里 。 你会发现大量的树操作的参考(镜像,身高,漂亮的印花等)。