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

时间:2018-10-23 17:37:09

标签: c++

我正在尝试通过用户输入来创建和打印二叉树,但是它不起作用。我正在提供输入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;
}

3 个答案:

答案 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

我建议您先在纸上运行代码,以了解如何添加节点。