首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >二值搜索树的遍历

二值搜索树的遍历
EN

Stack Overflow用户
提问于 2014-04-29 21:58:59
回答 2查看 1.3K关注 0票数 0

我正在尝试创建一个程序来处理二进制搜索树,而我的教练在这个声明中设置了这个函数,这个函数必须保持不变。

代码语言:javascript
复制
void BSTType<T>::traverse(std::ostream& out, TravType trav) const{

目前我是这样实现它的,但是std::ostream& out是用来做什么的,如何使用它是我的主要程序呢?我不明白为什么我们需要这个参数,而不是我正在使用的当前树。请尽快帮忙。这是在晚上8点到期的,我的教练也帮不上忙。如果需要更多的信息,请在评论或其他方面告诉我。

代码语言:javascript
复制
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);
}

这就是我从主程序调用这个函数的想法。

代码语言:javascript
复制
tree.traverse(???, IN);

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

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

代码语言:javascript
复制
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);
    }
}

编辑:由于某种原因,这个函数没有正确地复制我的树,有人知道为什么吗?

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2014-04-29 22:23:31

tree.traverse(???, IN); 我不明白问号在哪里。

你可以直接说:

??= std::cout

如果您想要在标准输出(即,它需要一个输出流)打印。

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

代码语言:javascript
复制
 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将变成:

代码语言:javascript
复制
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);
}
票数 2
EN

Stack Overflow用户

发布于 2014-04-29 22:02:57

代码语言:javascript
复制
std::ostream& out

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

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

inorder(root);应由inorder(out, root);取代

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

Add:using namespace std;,以便您可以调用tree.traverse(cout, IN);来使用标准输出

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23376061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档