【问题标题】:Need help on Binary tree procedures (NOT binary search tree)需要二叉树程序的帮助(不是二叉搜索树)
【发布时间】:2017-03-15 08:06:28
【问题描述】:

我正在尝试实现二叉树(不是二叉搜索树)。它主要是一个由插入/删除/搜索和清除程序组成的类模板。节点中保存的数据可以是任何东西。如下所示:

template<class T>
class BinaryTree
{
public:
    BinaryTree(int size);
    ~BinaryTree();
    virtual bool insert(T data);
    virtual bool remove(T data);
    virtual void clear();
    virtual bool search(T data);
    virtual void display(std::string str, ETravType type);
    virtual unsigned int getSize();
    //friend void swapWithLastNode(Node *root, Node **nodeToRemove);
protected:
    virtual void inorder(Node<T>* root);
    virtual void preorder(Node<T>* root);
    virtual void postorder(Node<T>* root);
    virtual void removeAll(Node<T>* root);
    Node<T>* root;
    int max;
    unsigned int curSize;
};

我需要一些算法方面的帮助,最好是迭代(由于堆栈大小限制,希望避免递归),用于插入、搜索和删除:

  • 插入:如何确保树不会向左/向右倾斜?

  • 删除:当节点有两个子节点时,删除的最佳方法是什么(例如:在 BST 中,您替换为中序后继)。

  • 搜索:是否有任何有效的方法来防止 O(n) 搜索?

网络上有大量 BST 过程的资源(大部分是递归的),但对于二叉树却没有(或者至少我找不到任何东西)。于是想到这里贴出来。

【问题讨论】:

  • 您关于插入和删除的问题似乎向我表明您不关心树中节点的位置,此时我需要问您为什么还要使用二叉树而不仅仅是一个单链表?

标签: c++ algorithm data-structures binary-tree


【解决方案1】:

有一个真正的理由支持 BST 而不是 BT。

BST 是 log(N) 用于插入、删除和搜索,而 BT 最终可能会以 O(N) 为代价完成树的遍历。

  1. 插入:如何确保树不会左/右倾斜?

    恐怕这不会对树的整体性能产生任何影响。如果您仍想这样做,请了解 self-balancing tree

  2. 删除:当节点有两个子节点时,删除的最佳方法是什么(例如:在 BST 中,您替换为中序后继)。

    对于删除,只需选择树的任何叶节点并在该位置替换它。二叉树没有模式,所以选择随机节点不会有任何区别。所以,提取叶子节点没有问题。

  3. 搜索:是否有任何有效的方法来防止 O(n) 搜索?

    不,没有更好的方法来阻止O(n) 搜索。您需要遍历完整的树,BT 中没有节点的模式/顺序来帮助您高效导航。

【讨论】:

    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2019-02-21
    • 2013-04-14
    相关资源
    最近更新 更多