C++ 如何修复二叉树级订单打印的以下代码

C++ 如何修复二叉树级订单打印的以下代码,c++,C++,我已经实现了下面的代码,用于在二叉树中打印节点的级别顺序。但是,当节点同时具有左和右子节点时,它会失败 例如,下面是我的二叉树 1 \ 2 \ 5 / \ 3 6 \ 4 预期产出为:1 2 5 3 6 4 但是,我的代码显示:1 2 5 3 4 4 我犯了什么错误?感觉像是指针弄糟了 以下是我编写的函数: void printNodes(Node *arr[], int numOfNodes) {

我已经实现了下面的代码,用于在二叉树中打印节点的级别顺序。但是,当节点同时具有左和右子节点时,它会失败

例如,下面是我的二叉树

 1
  \
   2
    \
     5
    /  \
   3    6
    \
     4  
预期产出为:1 2 5 3 6 4 但是,我的代码显示:1 2 5 3 4 4

我犯了什么错误?感觉像是指针弄糟了

以下是我编写的函数:

void printNodes(Node *arr[], int numOfNodes)
    {
        Node *outputArr[]={NULL};

        int j=0;

        for(int i=0; i<numOfNodes; i++)
        {
            printf("%d ",arr[i]->data);

            if(arr[i]->left!=NULL)
            {
                outputArr[j++]=arr[i]->left;
            }

            if(arr[i]->right!=NULL)
            {
                outputArr[j++]=arr[i]->right;
            }
        }

        if(j>0)
            printNodes(outputArr, j);
        else 
            return;
    }

    void levelOrder(Node * root) {
        Node *list[]={NULL};
        int ctr=0;

        if(root == NULL)
            return;

        printf("%d ",root->data);

        if(root->left != NULL)
            list[ctr++]=root->left;
        if(root->right != NULL)
            list[ctr++]=root->right;

        printNodes(list, ctr);
    }

假设您出于某种原因(教育或其他原因)正在做您正在做的事情,只需对其进行最低限度的修改,以实现我认为您希望您的方法实现的目标,请尝试以下方法:

void printNodes(std::vector<Node*> list) {
    std::vector<Node*> newList;

    for(int i=0; i<list.size(); i++) {
        printf("%d ",list[i]->data);

        if(list[i]->left) newList.push_back(list[i]->left);
        if(list[i]->right) newList.push_back(list[i]->right);
    }

    if(!newList.empty()) printNodes(newList);
    else return;
}

void levelOrder(Node * root) {
    if(!root) return;
    std::vector<Node*> list;

    printf("%d ",root->data);

    if(root->left) list.push_back(root.left);
    if(root->right) list.push_back(root.right);;

    printNodes(list);
}
void打印节点(标准::向量列表){
std::向量新列表;
对于(int i=0;idata);
if(list[i]->left)newList.push_back(list[i]->left);
if(list[i]->right)newList.push_back(list[i]->right);
}
如果(!newList.empty())打印节点(newList);
否则返回;
}
void levelOrder(节点*根){
如果(!root)返回;
std::向量表;
printf(“%d”,根->数据);
if(root->left)列表。向后推(root.left);
if(root->right)列表。向后推(root.right);;
打印节点(列表);
}

更好的解决方案可能是根本不使用递归,而是执行通常的宽度第一次遍历。

1)请提供。2) 当它显然不是C时,为什么要用标记呢?您为
Node*outputArr[]={NULL}分配了多少内存?问题甚至在此之前就开始了<代码>节点*列表[]={NULL}
基本上是在堆栈上创建的一个大小正好为1的
节点
ptr数组(我指数组中的elt数)。从这里开始下坡。{{}} GUPTA将{NUL}}替换为不可行-你需要指定一个大小。谢谢你的C++解决方案,但是如果我必须在C中完成它,我必须声明一个节点*数组的大小,对吗?@劳伦兹在C中的解决方案可能会稍微改变。有很多选择,但概念上是一样的。你可以效仿什么代码> STD::向量在C++中启动-如果有一个大小,如果要溢出,重新分配内存两个位置,复制所有的东西和<代码>免费< /代码>上一个内存。如果您知道树的最大级别大小,那么您每次都可以使用堆栈上的数组,无论我们在上面使用的是
vector
。这是脆弱的,但将只适用于某些输入(没有任何级别超过您的固定大小)。或者使用链表动态创建节点等。
void printNodes(std::vector<Node*> list) {
    std::vector<Node*> newList;

    for(int i=0; i<list.size(); i++) {
        printf("%d ",list[i]->data);

        if(list[i]->left) newList.push_back(list[i]->left);
        if(list[i]->right) newList.push_back(list[i]->right);
    }

    if(!newList.empty()) printNodes(newList);
    else return;
}

void levelOrder(Node * root) {
    if(!root) return;
    std::vector<Node*> list;

    printf("%d ",root->data);

    if(root->left) list.push_back(root.left);
    if(root->right) list.push_back(root.right);;

    printNodes(list);
}