首页 > 解决方案 > 在 C++ 中打印级别明智的二叉树

问题描述

输出给出 - 运行时错误(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: L:13,R:-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.
         */

    }

标签: c++data-structuresbinary-tree

解决方案


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.
         */

    }

推荐阅读