c++ - 我正在尝试创建一个函数“InOrder”,它在二分搜索中进行中序遍历
问题描述
我正在尝试将 InOrder 设为 void 类型,它在二叉搜索树中执行按顺序遍历。
//Code Provided by Professor
//Program 5.1:Inorder traversal of a binary tree
//===============================================
template <class T>
void Tree<T>::Inorder()
{// Driver.
Inorder(root);
}
template <class T>
void Tree<T>::Inorder(TreeNode<T> *currentNode)
{// Workhorse.
if (currentNode) {
Inorder(currentNode->leftChild);
Visit(currentNode);
Inorder(currentNode->rightChild);
}
}
以上代码由教授提供,作为自己制作InOrder函数的参考。
这段代码是我为我的二叉搜索树声明元素(必要条件)的方式。
#include <iostream>
using namespace std;
template<class K, class E>
class BinarySearchTree
{
public:
virtual void Insert(const pair<K, E>&) = 0;
virtual void Delete(const K&) = 0;
virtual pair<K, E>*Get(const K&) const = 0;
virtual void InOrder()const;
};
template<class T>
struct TreeNode {
T data;
TreeNode<T> *leftChild;
TreeNode<T> *rightChild;
TreeNode(T node) : data(node), leftChild(0), rightChild(0) {}
};
template<class K, class E>
class BST : BinarySearchTree<K, E> {
public:
BST() : root(0) {}
void Insert(const pair<K, E>&);
void Delete(const K&);
pair<K, E>*Get(const K&)const;
void InOrder()const;
private:
TreeNode<pair<K, E>> *root;
};
其他函数运行良好,如果使用 C++ 制作 InOrder 函数,我将不胜感激。
解决方案
有序的概念只是秩序的概念。您还必须说明按该顺序应该做什么。您的教授提供的代码调用了一个visit
函数。
这意味着在你的实现中,你还需要这样一个访问函数。它可以是硬编码的(在 上显示一个节点cout
),也可以更好地作为参数传递。在这种情况下,您应该声明InOrder
为:
void InOrder(void (*visit)(const pair<K, E>&))const;
然后将其(例如使用 lambda 函数)称为:
BST<int, string> bst;
...
bst.InOrder([](const pair<int, string>&ke) {
cout << "K: " << ke.first << " -E: " << ke.second << "\n";
});
模仿您教授的代码的可能实现可能是:
template<class K, class E>
void BST<K,E>::doInOrder(const TN* root, void (*visit)(const pair<K, E>&)) {
if (root) {
doInOrder(root->leftChild, visit);
visit(root->data);
doInOrder(root->rightChild, visit);
}
}
template<class K, class E>
void BST<K,E>::InOrder(void (*visit)(const pair<K, E>&))const {
doInOrder(root, visit);
}
推荐阅读
- jekyll - 在 jekyll 的 {{ path.url }} 中获取输出
- python - 使用 Python (MySQL) 的 Google Cloud Platform SQL:查询返回带有标头的空白数据框
- flutter - 如何使用 ListView 让 Flutter 中的 TabView 与 Telegram 相等?
- visual-studio - 试图在代码编辑器中恢复垂直滚动条
- c# - 是否可以在.net 中链接源生成器?
- java - 如何正确地将自定义按钮集转换为响应对象?
- python-3.x - zip 数据框和 numpy 数组一起迭代两个元素
- python - 为什么一直结束
- ios - 库中缺少 Swift UIViewController
- python - 为 Google 云存储对象创建生成的无过期时间的签名 url