需要有关二叉树过程的帮助(非二叉搜索树)

时间:2016-11-02 04:52:02

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

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

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中,您使用inorder继承者替换)。

  • 搜索:有没有有效的方法来阻止O(n)搜索?

网络上有大量资源用于BST程序(大多数是递归的),但没有二进制树(或至少我找不到任何东西)。因此想在这里发帖。

1 个答案:

答案 0 :(得分:4)

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

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

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

    我担心会使 与树的整体性能产生差异。如果您仍想这样做,请了解self-balancing tree

  2. 删除:当节点同时拥有两个孩子时,删除的最佳方法是什么(例如:在BST中,你用inorder继承者替换)。

    要删除,只需选择树的任何叶节点并将其替换为该位置。二叉树没有模式,因此选择随机节点不会产生任何差异。所以,拾取叶节点没问题。

  3. 搜索:有没有有效的方法来阻止O(n)搜索?

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