二叉树的平均深度为O(logN);
二叉查找树在二叉树的基础上,增加的性质为:对于树中每一个结点X,它的左子树中所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项。
该二叉查找树结点的数据结构:
struct BinaryNode{
Comparable element;//结点的值
BinaryNode * left;//结点的左孩子
BinaryNode * right;//结点的右孩子
int num;//相同值的结点出现的次数,如果不考虑重复元素的话,该成员可以省去
BinaryNode(const Comparable & e, BinaryNode* lt, BinaryNode* rt, int n):element(e), left(lt), right(rt), num(n){}
};
该结点数据结构其实是一个结点类。
该二叉查找树的主要成员函数:
BinarySearchTree(){root = NULL;}//构造函数
BinarySearchTree(vector<int> & v);//构造函数
BinarySearchTree(const BinarySearchTree & rhs);//复制构造函数
const BinarySearchTree & operator=(const BinarySearchTree & rhs);//赋值运算符重载
~BinarySearchTree();//析构函数
void preOrderPrintTree() const;//从小到大打印该二叉查找树
void inOrderPrintTree() const;//从大到小打印该二叉查找树
Comparable findMin() const;//查找最小值
Comparable findMax() const;//查找最大值
bool contains(const Comparable & x) const;//判断该二叉查找树是否包含值为x的结点
bool isEmpty() const;//判断该二叉查找树是否为空
void makeEmpty();//清空该二叉查找树
void insert(const Comparable & x);//插入结点
void remove(const Comparable & x);//移除结点值为x的结点
主要成员函数介绍:
void remove(const Comparable & x);//移除结点值为x的结点
/****************************************************************
* 函数名称:remove(const Comparable & x)
* 功能描述: 移除结点
* 参数列表: x -- 要移除的结点的值
* 返回结果:void
*****************************************************************/
template<typename Comparable>
void BinarySearchTree<Comparable>::remove(const Comparable & x)
{
remove(x, root);
}
template<typename Comparable>
void BinarySearchTree<Comparable>::remove(const Comparable & x, BinaryNode * &t) const
{
if(t == NULL)
return;
if(x < t->element)
remove(x, t->left);
else if(x > t->element)
remove(x, t->right);
else if((t->left != NULL) && (t->right != NULL)){//该结点有两个儿子的时候,将该结点右子树的最小结点覆盖该结点的值,然后再删除那个最小结点
t->element = findMin(t->right);
remove(t->element, t->right);
}
else {//该结点只有一个儿子的时候,将儿子放在当前结点的位置。用另一个指针保存当前结点,然后删除该结点;此时也包括该结点为叶子结点的情况
BinaryNode * oldCurrentNode = t;
t = (t->left == NULL) ? t->right : t->left;
delete oldCurrentNode;
}
}
下面的main函数是对remove成员函数的测试,用的就是上面两个图:
int main()
{
BinarySearchTree<int> tree;
tree.insert(6);
tree.insert(2);
tree.insert(1);
tree.insert(4);
tree.insert(3);
tree.insert(8);
tree.preOrderPrintTree();
tree.remove(4);
tree.preOrderPrintTree();
BinarySearchTree<int> tree2;
tree2.insert(6);
tree2.insert(2);
tree2.insert(1);
tree2.insert(5);
tree2.insert(3);
tree2.insert(4);
tree2.insert(8);
tree2.preOrderPrintTree();
tree2.remove(2);
tree2.preOrderPrintTree();
return 0;
}