C++ 打印的二叉树问题。用户输入不打印任何内容
我试图通过用户输入创建和打印一个二叉树,但它不起作用。我正在提供输入83101614144713-1,但没有打印任何内容。我做错了什么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
#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)