遍历二叉搜索树

时间:2014-04-29 21:59:00

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

我正在尝试创建一个使用二叉搜索树的程序,我的教师使用此声明设置了此功能,该声明必须保持不变。

void BSTType<T>::traverse(std::ostream& out, TravType trav) const{

目前这是我如何实现它,但什么是std :: ostream&amp;用于和如何使用这是我的主要程序?我不明白为什么我们需要这个作为参数,而不是我正在使用的当前树。请尽快帮忙。这是在晚上8点到期,我的导师不会帮忙。如果需要更多信息,请在评论中告诉我。

template <class T>
void BSTType<T>::traverse(std::ostream& out, TravType trav) const{
    if(trav==IN)
        inorder(root);
    else if(trav=PRE)
        preorder(root);
    else
        postorder(root);
}

这是我从主程序中调用此函数的想法

tree.traverse(???, IN);

这应该通过调用inorder(root)函数使用inorder遍历输出树。我不明白问号在哪里

这是遍历可以调用的函数,具体取决于用户输入的travType

void BSTType<T>::inorder(BTNodeType<T>* node) const{
    if (node!= NULL){
        inorder(node->left);
        std::cout << node->item << " ";
        inorder(node->right);
    }
}

template <class T>
void BSTType<T>::postorder(BTNodeType<T>* node) const{
    if (node!= NULL){
        postorder(node->left);
        postorder(node->right);
        std::cout << node->item << " ";
    }
}

template <class T>
void BSTType<T>::preorder(BTNodeType<T>* node) const{
    if(node!=NULL){
        std::cout << node->item<< " ";
        preorder(node-> left);
        preorder(node-> right);
    }
}

修改 由于某种原因,这个功能没有正确复制我的树,任何人都知道为什么?

template <class T>
void BSTType<T>::copy(BTNodeType<T>*& node1, BTNodeType<T>* node2){
    if(node2==NULL)
        node1=NULL;
    else{
        node1=new BTNodeType<T>;
        node1->item=node2->item;
        copy(node1->left, node2->left);
        copy(node1->right, node2->right);
    }
}

2 个答案:

答案 0 :(得分:2)

tree.traverse(???, IN);我不明白问号所在的位置。

你可以放:

??? = std::cout

如果要以标准输出打印(即需要output stream)。

此外,建议将输出流作为输入参数传递给您发布的成员函数,即您的成员函数将成为:

 void BSTType<T>::inorder(BTNodeType<T>* node, std::ostream& out) const{
    if (node!= 0){
        inorder(node->left);
        out << node->item << " ";
        inorder(node->right);
    }
}

template <class T>
void BSTType<T>::postorder(BTNodeType<T>* node, std::ostream& out) const{
    if (node!= 0){
        postorder(node->left);
        postorder(node->right);
        out << node->item << " ";
    }
}

template <class T>
void BSTType<T>::preorder(BTNodeType<T>* node, std::ostream& out) const{
    if(node!=0){
        out << node->item<< " ";
        preorder(node-> left);
        preorder(node-> right);
    }
}

然后traverse将成为:

template <class T>
void BSTType<T>::traverse(std::ostream& out, TravType trav) const{
    if(trav==IN)
        inorder(root, out);
    else if(trav=PRE)
        preorder(root, out);
    else
        postorder(root, out);
}

答案 1 :(得分:0)

std::ostream& out

是输出流,用于在访问时附加不同的节点信息,以便能够按照访问的顺序打印整个树。

算法应该是这样的:out << node.getValue()。这会将当前值附加到输出字符串。根据每个算法,调用的顺序会发生变化,但它们都会导致这三个动作的顺序不同:附加节点的信息,然后调用左或右子。

inorder(root);应替换为inorder(out, root);

在内部有序,它应该:out << root.getValue()附加值

添加:using namespace std;,以便您可以致电tree.traverse(cout, IN);以使用标准输出

相关问题