【问题标题】:Create special binary search tree using C++使用 C++ 创建特殊的二叉搜索树
【发布时间】:2020-02-15 18:35:25
【问题描述】:

我想创建一个具有特殊节点的二叉搜索树。节点应该分为三类,内部节点、外部节点和根节点,每类都继承一个共同的父节点,并且每种类型的节点都有一些独特的功能。是否可以创建这样的 BST。我面临的问题是假设我插入树的第一个节点成为根节点。我插入的下一个节点将成为外部节点。现在,如果我插入另一个节点,则外部节点必须成为内部节点,新节点将成为外部节点。此外,我找不到一种方法来从一个节点导航到另一个节点,因为节点将具有不同的类型。可以创建这种类型的树。如果是,请给我一些关于如何做到这一点的建议。

【问题讨论】:

  • 您能否展示您已经编写的程序,并解释您的程序究竟是如何不工作或没有产生预期的结果?您必须首先展示您的工作,并且在通过 stackoverflow.com 寻求帮助之前,它必须是真诚地尝试实现您的程序,而不是几行象征性的代码。我们不会在这里为其他人编写整个程序。有关更多信息,请参阅How to Ask 问题,获取tour,并阅读help center
  • 等等,我想我明白他/她的意思了。 Lengdon:请发布您目前所拥有的内容。
  • 所以你是说叶子节点都是外部节点,其他节点都是内部节点(根节点除外)?
  • 是的,其他节点是内部的。除了根和外部(叶)节点都是内部的
  • Sam Varshavchik 我从来没有说过我想要解决问题的代码。我想要的只是一些简单的英语而不是代码的建议。无论如何,einpoklum 回答了我的问题。

标签: c++ static-typing duck-typing


【解决方案1】:

如果我理解正确,您担心一个类中的对象 - 外部 - 需要成为另一类 - 内部的对象。这一点,当 C++ 是一种静态类型语言时:类型(包括对象的类)是在编译时确定的。对吧?

嗯,您可以通过以下两种方式中的至少一种来实现:

  1. 当外部节点变为内部节点时,删除外部节点并将其替换为内部节点,并正确初始化(例如指向新的外部节点)。
  2. 放弃 External 和 Internal 是离散类型,只检查子节点和父节点以动态确定节点类型。

关于这些问题的一些更相关的阅读材料:

【讨论】:

    【解决方案2】:

    您可以使用基本继承某些类型的枚举和递归调用。 这可能是一个起点:

    enum NodeType
    {
        eRoot,
        eInternal,
        eExternal
    };
    
    class BinaryNode
    {
    public:
       virtual NodeType GetType() = 0;
       virtual void UpdateTree() = 0;
    
    protected:
       BinaryNode* ChildLeft;
       BinaryNode* ChildRight;
       BinaryNode* Parent;
    };
    
    class ExternalNode : public BinaryNode 
    {
       NodeType GetType() override { return eExternal; }
       void UpdateTree() override 
       { 
          //... Replace node instances here(e.g. delete this node and construct the correct new one given this sub tree. call new InternalNode(this) for example) 
          // Call this towards the parent node so the tree will be transformed accordingly
       }
    }
    class InternalNode : public BinaryNode 
    { 
       NodeType GetType() override { return eInternal; }
       void UpdateTree() override { //... }
    }
    class RootNode : public BinaryNode 
    { 
       NodeType GetType() override { return eRoot; }
       void UpdateTree() override { //... }
    }
    
    

    这只是为了让您知道从哪里开始。您可以在运行时通过 GetType() 检查节点类型,并在此基础上进行一些检查。

    请注意,这种转换并不是特别快。 如果您希望它更快,请不要使用不同的类型和虚函数调用和指针。

    将二叉树放在一个数组中并使用二叉​​索引,因此在给定索引“n”处,使用2*n+1 获取左孩子,使用2*n+2 获取右孩子。然后使用一些标志(根、外部、内部等)来确定要在二进制节点上调用哪些函数。我不会像在我的代码示例中那样使用继承来提高速度或提高可读性。事实上,从外部决定在节点上调用哪些函数会更易读,更不容易出错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      相关资源
      最近更新 更多