我正在尝试实现二叉树(不是二叉搜索树)。它主要是一个由插入/删除/搜索&组成的类模板。程序清晰。节点中保存的数据可以是任何数据。如下所示:
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程序(大多数是递归的),但没有二进制树(或至少我找不到任何东西)。因此想在这里发帖。
答案 0 :(得分:4)
有一个真正的理由支持BST而不是BT。
BST log(N)
用于插入,删除和搜索,而BT最终可能会以O(N)
为代价完全遍历树。
插入:如何确保树不会左/右倾斜?
我担心不会使 与树的整体性能产生差异。如果您仍想这样做,请了解self-balancing tree。
删除:当节点同时拥有两个孩子时,删除的最佳方法是什么(例如:在BST中,你用inorder继承者替换)。
要删除,只需选择树的任何叶节点并将其替换为该位置。二叉树没有模式,因此选择随机节点不会产生任何差异。所以,拾取叶节点没问题。
搜索:有没有有效的方法来阻止O(n)搜索?
不,没有更好的方法来阻止O(n)
搜索。您需要遍历整个树,BT中没有节点的模式/顺序来帮助您有效地导航。