【问题标题】:I'm trying to make a function "InOrder", which does inorder traversing in Binary Search我正在尝试创建一个函数“InOrder”,它在二分搜索中进行中序遍历
【发布时间】:2019-05-27 07:13:06
【问题描述】:

我正在尝试将 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 函数的帮助,我将不胜感激。

【问题讨论】:

  • 您获得的代码只是类型略有不同,所以请说明您遇到的问题。
  • @RR 你能解释一下为什么插入需要一对吗? K、E 意味着什么? TreeNode 只存储一种类型(类)。
  • 也许你会发现二叉搜索树的中序遍历与任意二叉树的中序遍历完全相同。
  • 不相关,但您的类包含一堆原始指针。这意味着它们应该具有非平凡的析构函数,以及显式或删除的复制/移动 ctor 和赋值运算符。
  • @Lakhera Insert 需要一对,因为 TreeNode 对是以 的形式构成的。这就是为什么。

标签: c++ data-structures binary-search-tree inorder


【解决方案1】:

in order的概念就是顺序的概念。您还必须说明按该顺序应该做什么。您的教授提供的代码调用了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);
}

【讨论】:

    猜你喜欢
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多