【发布时间】: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