我正在尝试通过用户输入来创建和打印二叉树,但是它不起作用。我正在提供输入8 3 10 1 6 14 4 7 13 -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;
}
答案 0 :(得分:4)
您的程序仍在等待输入。我将尝试使用调用图来解释原因。假设您使用输入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
,以结束每个等待的节点。另外,请注意,由于您要插入元素 depth-first ,所以该树非常线性。您可以像8 3 -1 -1 10 -1 -1
那样构造输入,这将创建以下树:
null
/
(3)
/ \
/ null
(8)
\ null
\ /
(10)
\
null
因此,您不会致力于线性树。如果要创建平衡树,您可以做的一件事是首先将所有输入读入std::vector<int>
直到读取第一个-1
,然后使用该向量将元素插入宽度优先顺序。另外,您也可以使用二叉搜索树的技术来逐个插入元素。
答案 1 :(得分:1)
我强烈建议您对程序进行重组,使其对输入值的处理方式有所不同。因此,您的问题在于如何处理无效的输入值。当您在左孩子处达到无效的输入值时,您将再次查询用户输入。同样,对于每个递归调用,您要推送另一个必须在堆栈展开时重新评估的输入提示。要看到这种情况,请放置类似
cout << ">>>";
之前的cin >> d
。完成此输入后,这些值10 1 6 14 4 7 13 -1 -1 -1 -1 -1 -1 -1 -1
。由于您在10 1 6 14 4 7 13`上推送了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;
}
答案 2 :(得分:1)
此代码从左侧开始形成一棵树,它将不断向左子树递归添加节点,直到您输入-1
。
我正在提供输入8 3 10 1 6 14 4 7 13 -1,但是什么都没打印
通过输入-1
,您只结束了13的左子树。此后,程序期望输入13的右子树,依此类推。因此,您需要输入尽可能多的叶子-1
,每次要切换到正确的子树时都需要输入-1
。
我建议您先在纸上运行代码,以了解如何添加节点。