【问题标题】:Why isn't my printLevel function working?为什么我的 printLevel 函数不起作用?
【发布时间】:2013-10-10 14:11:55
【问题描述】:

我已经编写了这段代码来执行二叉搜索树的级别顺序遍历。错误仅在 printLevel 函数中,因为所有其他函数都工作正常。

#include <queue>
using namespace std;
struct node{
int data;
struct node* left;
struct node* right;
};

struct node* newNode(int data){
struct node* node = new (struct node);
node->data=data;
node->left=NULL;
node->right=NULL;
return (node);
};
struct node* insert (struct node* node, int data){
if (node==NULL){
    return (newNode(data));
}
else {
    if (data<=node->data) node-> left=insert(node->left,data);
    else node->right=insert(node->right,data);
    return (node);
}

}

void printLevel(struct node* node){
    queue<struct node*> q;
    while(node!=NULL){
        cout << node->data << " ";
        q.push(node->left);
        q.push(node->right);
        node=q.front();
    }
}
int main(){
    int n;
    cin >>n;
    int m;
    cin >>m;
    struct node* root=newNode(m);
    for (int i=0;i<n-1;i++){
        cin>>m;
        insert(root,m);
    }
    printLevel(root);
//  printPostOrder(root);
//  cout <<maxDepth(root);
//  debug(maxDepth(root),   minValue(root), printTree(root));
    //struct node* root=build123();
}

这里是算法:(http://www.geeksforgeeks.org/level-order-tree-traversal/)

printLevelorder(树)

1) 创建一个空队列q

2) temp_node = root /从根开始/

3) 当 temp_node 不为 NULL 时循环

a) print temp_node->data.

b) Enqueue temp_node’s children (first left then right children) to q

c) Dequeue a node from q and assign it’s value to temp_node

我为 7 个节点输入 3,1,4,2,7,6,5。它陷入无限循环。我还基于另一种方法实现了以下两个功能,并且运行良好:

   void levelOrder(struct node* node, int level ){
    if (node==NULL){
        return;
    }
    if (level==1){
        cout << node->data;
    }
    else if (level>1){
        levelOrder(node->left,level-1);
        levelOrder(node->right,level-1);

    }
}
void printLevelOrder(struct node* root){
    for (int i=1;i<=maxDepth(root);i++){
        levelOrder(root,i);
    }
}

它是 O(n^2) 但高于一个是 O(n)。我的代码有什么问题?谢谢。

【问题讨论】:

  • 您可能希望在调试器中逐行逐行执行代码。包括节点的创建和插入到树中。

标签: c++ stl tree queue


【解决方案1】:

我怀疑你的循环终止是错误的。

您应该检查!q.empty(),而不是node != NULL

另外,调用q.front 不会从队列中移除元素;为此,您需要pop(在调用front 之后)。

此代码适用于我:

void printLevel(struct node* node){
    std::queue<struct node*> q;
    q.push(node);
    while(!q.empty()) {
        node=q.front();
        q.pop();
        if ( node != NULL ) {
            std::cout << node->data << " ";
            q.push(node->left);
            q.push(node->right);
            }
    }
}

【讨论】:

  • +1 您的怀疑是有根据的。实际的算法是在入口处推送第一个节点,然后通过从队列中弹出一个节点、打印它、推送其子节点来循环,重复直到队列为空。
猜你喜欢
  • 2021-03-21
  • 2021-12-18
  • 2011-06-23
  • 2017-08-18
  • 2010-10-18
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多