C++ 打印的二叉树问题。用户输入不打印任何内容

C++ 打印的二叉树问题。用户输入不打印任何内容,c++,C++,我试图通过用户输入创建和打印一个二叉树,但它不起作用。我正在提供输入83101614144713-1,但没有打印任何内容。我做错了什么 #include<iostream> #include<queue> using namespace std; class node {public: int data; //data for node node* left;//pointer for left subtree node* right;//poin

我试图通过用户输入创建和打印一个二叉树,但它不起作用。我正在提供输入83101614144713-1,但没有打印任何内容。我做错了什么

#include<iostream>
#include<queue>
using namespace std;
class node
{public:
    int data; //data for node
    node* left;//pointer for left subtree
    node* right;//pointer for right subtree
    node(int d):data(d),left(NULL),right(NULL) //constructor
    {

    }
};

node* createTree() //creating tree
{
    int d;
    cin>>d;
    if(d==-1)
    {
        return NULL; //when user inputs -1 return NULL
    }

    node* root=new node(d);
    root->left=createTree();
    root->right=createTree();
    return root;
}

void printTree(node* root)
{
    if(root==NULL)
    {
        return; //when null is encountered return
    }

    cout<<root->data<<" ";
    printTree(root->left); //printing recursively left subtree
    printTree(root->right);//printing recursively right subtree
}

int main()
{
   node* root=createTree(); 
   printTree(root);
   return 0;
}
#包括
#包括
使用名称空间std;
类节点
{公众:
int data;//节点的数据
node*left;//左子树的指针
node*right;//右子树的指针
节点(intd):数据(d)、左(NULL)、右(NULL)//构造函数
{
}
};
node*createTree()//创建树
{
int d;
cin>>d;
如果(d==-1)
{
return NULL;//当用户输入时-1返回NULL
}
节点*根=新节点(d);
root->left=createTree();
root->right=createTree();
返回根;
}
无效打印树(节点*根)
{
if(root==NULL)
{
return;//遇到null时返回
}

cout您的程序仍在等待输入。我将尝试使用调用图解释原因。假设您使用输入
8 3 10 1
运行程序。这将创建如下函数调用树:

                                                     (next input)
                                                    /
                                        (4, input=1)
                                       /            \
                          (3, input=10)              (waiting...)
                         /             \
             (2, input=3)               (waiting...)
START:      /            \
(1, input=8)              (waiting...)
            \
             (waiting...)
这里,每个标记为
waiting…
的节点都对应于对
createTree
的调用,它总是通过
cin>>d;
语句请求用户输入。要完成此树,您实际上需要输入
8 3 10 1-1-1-1-1-1-1
,以结束每个等待的节点。另外,请注意,此树非常复杂inear,因为您要先插入元素深度。您可以像
8 3-1-1 10-1-1
那样构造输入,这将创建以下树:

         null
        /
     (3)
    /   \
   /     null
(8)
   \      null
    \    /
     (10)
         \
          null

因此,您不会致力于线性树。如果您想创建一个平衡树,您可以做的一件事是首先将所有输入读取到
std::vector
中,直到读取第一个
-1
,然后使用该向量以宽度优先顺序插入元素。或者,您可以使用技术逐个插入元素二进制搜索树的问题。

您的程序仍在等待输入。我将尝试使用调用图解释原因。假设您使用输入运行程序
8 3 10 1
。这将创建如下函数调用树:

                                                     (next input)
                                                    /
                                        (4, input=1)
                                       /            \
                          (3, input=10)              (waiting...)
                         /             \
             (2, input=3)               (waiting...)
START:      /            \
(1, input=8)              (waiting...)
            \
             (waiting...)
这里,每个标记为
waiting…
的节点都对应于对
createTree
的调用,它总是通过
cin>>d;
语句请求用户输入。要完成此树,您实际上需要输入
8 3 10 1-1-1-1-1-1-1
,以结束每个等待的节点。另外,请注意,此树非常复杂inear,因为您要先插入元素深度。您可以像
8 3-1-1 10-1-1
那样构造输入,这将创建以下树:

         null
        /
     (3)
    /   \
   /     null
(8)
   \      null
    \    /
     (10)
         \
          null

因此,您不会致力于线性树。如果您想创建一个平衡树,您可以做的一件事是首先将所有输入读取到
std::vector
中,直到读取第一个
-1
,然后使用该向量以宽度优先顺序插入元素。或者,您可以使用技术逐个插入元素二进制搜索树的问题。

我强烈建议重新构造程序,使其以不同的方式处理输入值。因此,您的问题在于如何处理无效的输入值。当您在左子级找到无效的输入值时,您将再次查询用户输入。此外,对于每个递归调用,您将在按下另一个必须在堆栈展开时重新计算的输入提示之前
cout>d
。完成此操作后,请输入这些值
10161447713-1-1-1-1-1-1-1-1
。由于您在101644713`上按了7个值,因此这些调用中的每一个都希望在回调时有另一个输入,因此您的createnode会发出是否继续的信号。

下面是一个遵循类似输入模式的修改版本

#include<iostream>
#include<queue>
using namespace std;
class node
{
public:
    int data; //data for node
    node* left;//pointer for left subtree
    node* right;//pointer for right subtree
    node(int d) :data(d), left(NULL), right(NULL) //constructor
    {

    }

};

bool createTree(node ** root) //creating tree
{

    int d;
    cin >> d;
    if (d == -1)
    {
        return false; //when user inputs -1 return NULL
    }

    (*root) = new node(d);

    if (createTree(&(*root)->left))
        return createTree(&(*root)->right);
    return false;

}

void printTree(node* root)
{
    if (root == NULL)
    {
        return; //when null is encountered return
    }

    cout << root->data << " ";
    printTree(root->left); //printing recursively left subtree
    printTree(root->right);//printing recursively right subtree

}

int main()
{
    node* root;
    createTree(&root);
    printTree(root);
    system("pause");
    return 0;
}
#包括
#包括
使用名称空间std;
类节点
{
公众:
int data;//节点的数据
node*left;//左子树的指针
node*right;//右子树的指针
节点(intd):数据(d)、左(NULL)、右(NULL)//构造函数
{
}
};
bool createTree(节点**根)//创建树
{
int d;
cin>>d;
如果(d==-1)
{
return false;//当用户输入时-1返回NULL
}
(*根)=新节点(d);
if(createTree(&(*root)->左))
返回createTree(&(*root)->右侧);
返回false;
}
无效打印树(节点*根)
{
if(root==NULL)
{
return;//遇到null时返回
}
cout data left);//递归打印左子树
printTree(根->右);//递归打印右子树
}
int main()
{
节点*根;
createTree(&root);
打印树(根);
系统(“暂停”);
返回0;
}

我强烈建议重组您的程序,使其能够以不同的方式处理输入值。因此,您的问题在于如何处理无效的输入值。当您在左侧子项处达到无效的输入值时,您将再次查询用户输入。此外,对于每个递归调用,您都会推送另一个输入值必须在堆栈展开时重新评估ompt
cout>d
。完成此操作后,请输入这些值
10161447713-1-1-1-1-1-1-1-1
。由于您在101644713`上按了7个值,因此这些调用中的每一个都希望在回调时有另一个输入,因此您的createnode会发出是否继续的信号。

下面是一个遵循类似输入模式的修改版本

#include<iostream>
#include<queue>
using namespace std;
class node
{
public:
    int data; //data for node
    node* left;//pointer for left subtree
    node* right;//pointer for right subtree
    node(int d) :data(d), left(NULL), right(NULL) //constructor
    {

    }

};

bool createTree(node ** root) //creating tree
{

    int d;
    cin >> d;
    if (d == -1)
    {
        return false; //when user inputs -1 return NULL
    }

    (*root) = new node(d);

    if (createTree(&(*root)->left))
        return createTree(&(*root)->right);
    return false;

}

void printTree(node* root)
{
    if (root == NULL)
    {
        return; //when null is encountered return
    }

    cout << root->data << " ";
    printTree(root->left); //printing recursively left subtree
    printTree(root->right);//printing recursively right subtree

}

int main()
{
    node* root;
    createTree(&root);
    printTree(root);
    system("pause");
    return 0;
}
#包括
#包括
使用名称空间std;
类节点
{
公众:
int data;//节点的数据
node*left;//左子树的指针
node*right;//右子树的指针
节点(int d):数据(d),左(NULL)