【问题标题】:Print Level Wise Binary Tree in C++在 C++ 中打印级别明智的二叉树
【发布时间】:2020-04-15 09:53:19
【问题描述】:

输出给出 - 运行时错误 (SIGSEGV)。可能是什么问题?

问题:

给定一棵二叉树,按层次顺序打印树。 要打印具有数据 N 的节点,您需要遵循确切的格式 - N:L:x,R:y 其中,N 是二叉树中存在的任何节点的数据。 x 和 y 是节点 N 的左右子节点的值。打印 -1。如果任何孩子为空。 中间没有空隙。 您需要在不同的行中打印级别订单表单中的所有节点。 输入格式: 水平顺序形式的元素(以空格分隔) (如果任何节点没有左或右孩子,则取 -1 代替) 示例输入:

8 3 10 1 6 -1 14 -1 -1 4 7 13 -1 -1 -1 -1 -1 -1 -1

样本输出:

8:L:3,R:10 3:L:1,R:6 10:L:-1,R:14 1:L:-1,R:-1 6:L:4,R: 7 14:左:13,右:-1 4:L:-1,R:-1 7:L:-1,R:-1 13:L:-1,R:-1

代码如下:

// Following is the Binary Tree node structure
/**************
class BinaryTreeNode {
    public : 
    T data;
    BinaryTreeNode<T> *left;
    BinaryTreeNode<T> *right;

    BinaryTreeNode(T data) {
        this -> data = data;
        left = NULL;
        right = NULL;
    }
};
***************/

    void printLevelWise(BinaryTreeNode<int> *root) {
        if(root == NULL){
            return;
        }
        cout << root->data << ":";
        queue<BinaryTreeNode<int>*> pendingNodes;
        pendingNodes.push(root);
        while(pendingNodes.size() != NULL){
            BinaryTreeNode<int>* front = pendingNodes.front();
            pendingNodes.pop();
            if(front->left->data != -1){
                cout << "L:" << front->left->data << ",";
                pendingNodes.push(front->left);
                }
            else if(front->left->data == -1){
                cout << "L:" << "-1" << ",";
            }
            if(front->right->data != -1){
                cout << "R:" << front->right->data;
                pendingNodes.push(front->right);
            }
            else if(front->left->data == -1){
                cout << "R:" << "-1";
            }
            cout << endl;


        }
        /* Don't write main().
         * Don't read input, it is passed as function argument.
         * Print output and don't return it.
         * Taking input is handled automatically.
         */

    }

【问题讨论】:

  • 描述说“打印-1。如果任何孩子为空。”它没有说“打印-1。如果孩子的数据是-1。”
  • 你能告诉我代码逻辑有什么问题吗?

标签: c++ data-structures binary-tree


【解决方案1】:

if(front->left->data != -1) 当您的子树不包含左节点并且您正在检查 left->data!=-1 这就是为什么你得到运行时错误(SIGSEGV)

使用此代码

/**************
class BinaryTreeNode {
    public : 
    T data;
    BinaryTreeNode<T> *left;
    BinaryTreeNode<T> *right;

    BinaryTreeNode(T data) {
        this -> data = data;
        left = NULL;
        right = NULL;
    }
};
***************/

    void printLevelWise(BinaryTreeNode<int> *root) {
        if(root == NULL){
            return;
        }
        queue<BinaryTreeNode<int>*> pendingNodes;
        pendingNodes.push(root);
        while(pendingNodes.size() != NULL){

            BinaryTreeNode<int>* front = pendingNodes.front();
            pendingNodes.pop();
            cout << front->data << ":";
            if(front->left){
               if(front->left->data != -1){
                cout << "L:" << front->left->data << ",";
                pendingNodes.push(front->left);
                }
            else{
                cout << "L:" << "-1" << ",";
               }
            }
           if(front->right){
            if(front->right->data != -1){
                cout << "R:" << front->right->data;
                pendingNodes.push(front->right);
              }
            else{
                cout << "R:" << "-1";
            }
           }
        }
        /* Don't write main().
         * Don't read input, it is passed as function argument.
         * Print output and don't return it.
         * Taking input is handled automatically.
         */

    }

【讨论】:

  • 谢谢,现在没有编译错误但是输出不正确。
【解决方案2】:

正如描述所说,如果孩子为空,您应该打印“-1”。
如果孩子的data-1,它并没有说你应该打印“-1”。
这与打印data 相同,因此不会将其描述为特殊情况。
(彻底阅读问题描述非常重要。我认为您将其与程序的输入格式混淆了,该格式具有 -1 表示不存在子节点,但这不是您的函数的输入。)

你需要

if(front->left != nullptr) {
    cout << "L:" << front->left->data << ",";
    pendingNodes.push(front->left);
}
else {
    cout << "L:" << "-1" << ",";
}

(您还需要调整打印逗号的方式,但这是另一个问题。)

【讨论】:

    【解决方案3】:
    void printLevelWise(BinaryTreeNode<int> *root)
    {
        if (root == NULL)
        {
            return;
        }
        queue<BinaryTreeNode<int> *> pendingNodes;
        pendingNodes.push(root);
        while (pendingNodes.size() != NULL)
        {
    
            BinaryTreeNode<int> *front = pendingNodes.front();
            pendingNodes.pop();
            cout << front->data << ":";
    
            if (front->left)
            {
                if (front->left->data != -1)
                {
                    cout << "L:" << front->left->data << ",";
                    pendingNodes.push(front->left);
                }
            }
            else
            {
                cout << "L:"<< "-1"<< ",";
            }
    
    
            if (front->right)
            {
                if (front->right->data != -1)
                {
                    cout << "R:" << front->right->data;
                    pendingNodes.push(front->right);
                }
            }
            else
            {
                cout << "R:"<< "-1";
            }
    
            cout<<endl;
        }
    
    }
    

    【讨论】:

    • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    相关资源
    最近更新 更多