【问题标题】:Binary Search Tree PostOrder and PreOrder Traversals are wrong二叉搜索树 PostOrder 和 PreOrder 遍历是错误的
【发布时间】:2011-03-13 05:30:43
【问题描述】:

我正在做这个作业,我需要按前序、后序和中序打印我的二叉搜索树。但是,似乎只有我的中序方法有效。我使用以下测试用例来检查我的工作。

http://www.theteacher99.btinternet.co.uk/theteacher/newalevel/cp4_5_4.htm

你能看看我下面的代码,看看我做错了什么。任何帮助/方向将不胜感激。你不必为我解决它,只要让我知道我做错了什么。谢谢。

#include <iostream>
#include <fstream>
#include <cstddef>
#include <string>
#include <sstream>
#include <string>

using namespace std;

struct TreeNode
{
    string item;
    TreeNode *left;
    TreeNode *right;
};

class BinarySortTree
{
public:
    BinarySortTree();
    void readFile(string fileName);
    void insert(string key);
    void preorder();
    void postorder();
    void inorder();
    void test();

private:
    TreeNode *root;
    void insert(string key, TreeNode *node);
    void preorderTraverse(TreeNode *node);
    void postorderTraverse(TreeNode *node);
    void inorderTraverse(TreeNode *node);
};


//default constructor, create new binary tree
BinarySortTree::BinarySortTree()
{
    root = NULL;
}

//reads the file and puts items in the tree
void BinarySortTree::readFile(string fileName)
{
    ifstream inputStream(fileName.c_str());

    if(inputStream.is_open())
    {
        string line;

        while( getline(inputStream, line) )
        {
            insert(line);
        }
    }
}

void BinarySortTree::insert(string key)
{
    if(root != NULL)
    {
        insert(key, root);
    }
    else
    {
        root = new TreeNode;
        root->item = key;
        root->left = NULL;
        root->right = NULL;
    }
}

void BinarySortTree::insert(string key, TreeNode *node)
{
    bool done = false;

    while(!done)
    {
        if(key.compare(node->item) < 0)
        {
            if(node->left != NULL)
            {
                node = node->left;
            }
            else
            {
                node->left = new TreeNode;
                node->left->item = key;
                node->left->left = NULL;
                node->left->right = NULL;
                done = true;
            }
        }
        else if(key.compare(node->item) > 0)
        {
            if(node->right != NULL)
            {
                node = node->right;
            }
            else
            {
                node->right = new TreeNode;
                node->right->item = key;
                node->right->left = NULL;
                node->right->right = NULL;
                done = true;
            }
        }
        else if(key.compare(node->item) == 0)
        {
            done = true;
        }
    }
}

void BinarySortTree::preorder()
{
    cout << "PreOrder Traversal" << endl;
    preorderTraverse(root);
    cout << endl;

}

/*
   1. Start at the root node
   2. Traverse the left subtree
   3. Traverse the right subtree
*/
void BinarySortTree::preorderTraverse(TreeNode *node)
{
    if(node != NULL)
    {
        cout << node->item << " ";
        preorderTraverse(node->left);
        preorderTraverse(node->right);
    }

}

void BinarySortTree::postorder()
{
    cout << "PostOrder Traversal" << endl;
    postorderTraverse(root);
    cout << endl;
}

/*
   1. Traverse the left subtree
   2. Traverse the right subtree
   3. Visit the root node
*/
void BinarySortTree::postorderTraverse(TreeNode *node)
{
    if(node != NULL)
    {
        postorderTraverse(node->left);
        postorderTraverse(node->right);
        cout << node->item << " ";
    }
}

void BinarySortTree::inorder()
{
    cout << "InOrder Traversal" << endl;
    inorderTraverse(root);
    cout << endl;
}

/*
   1. Traverse the left subtree
   2. Visit the root node
   3. Traverse the right subtree
*/
void BinarySortTree::inorderTraverse(TreeNode *node)
{
    if(node!= NULL)
    {
        inorderTraverse(node->left);
        cout << node->item << " ";
        inorderTraverse(node->right);
    }
}

void BinarySortTree::test()
{
    cout << root->item << endl;
}


int main()
{
    string fileName = "a4.txt";
    BinarySortTree bst;
    bst.readFile(fileName);
    bst.test();

    bst.preorder();
    bst.postorder();
    bst.inorder();

    return 0;
}

【问题讨论】:

  • 这里的代码似乎是正确的。您能否详细说明您认为它无法正常工作的原因?
  • 代码编译正常,没有错误。问题是当我打印节点时,我没有得到与我正在使用的测试页相同的值。我不知道,也许我只是没有按正确的顺序打印。
  • 添加我的整个代码...也许我的插入方法不正确,因为我的根是'A'
  • 我正在寻找,我的插入方法永远不会插入到左侧。那是我的问题
  • 关于 SO 的问题应该充当一种规范文档,就像 wiki 页面一样,以便它们可以在未来帮助人们。您能否回滚您的编辑,并将代码放回问题中?如前所述,没有代码,这个问题毫无价值。

标签: c++ binary-tree tree-traversal binary-search-tree


【解决方案1】:

你没有做错任何事。我得到了它的编译,它工作正常,并通过了这些测试。我不必对您提供的代码进行任何更改 - 只需添加它,以便正确编译和初始化结构。

确保在TreeNode 的构造函数中将left/right 指针分配给NULL,并正确地将D 节点作为root 传递。还要记住删除您通过new TreeNode 创建的任何节点。如果你在堆栈上创建它们(没有new的普通局部变量),你当然不必删除它们。

【讨论】:

    【解决方案2】:

    您的代码是正确的。但是 main() 函数在哪里呢?

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      相关资源
      最近更新 更多