因为在关联容器里面主要的内部结构是RB-tree,而红黑树又是一种平衡二叉树,平衡二叉树又是属于二叉查询树,所以按照 侯捷介绍的顺序依次来实现,今天先把二叉查询树这种最简单的实现掉:
首先,二叉查询树 不像heap中完全二叉树那样内存分配用线性存储的,二叉查询树一般内部存储是通过链表来实现的,首先来看每个节点的数据结构:
每个节点都包含了它的孩子节点信息,这样可以很方便的向下递归查询。
因为二叉查询树是要求 左子节点<父节点<右子节点。根据每个节点的结构,我们在树中只需要包含root节点就可以遍历到整个树了,所以在树中,我们必须包含root 节点,而且只需要root 节点就可以了,所以在tree中我们的成员变量为:
private:
PNODE root;
其中的PNODE 是节点指针类型 即: node<T>*
如果我们要插入数据到树中,那么我们只需要下面几步就可以了:
1.给需要插入的值 分配一个节点空间。
2.通过递归找到需要插入的地方,即找到他的父节点。
3.把这个节点地址赋给父节点的左孩子或者右孩子。
首先实现第一步:
那么 2,3怎么来实现呢:
通过一个递归函数:
同样,如果我们要删除一个元素,那么 我们也可以通过下面步骤:
1.找到需要填充到这个位置的叶子节点。
2.把叶子节点的值赋给要删除的这个元素。
3.删除这个叶子节点。
关键是第一步,怎么找到要替换的节点,其实我们只要找到以这个节点为跟节点的子树中比这个节点稍大点的节点就可以了,怎么找到比这个节点稍大点呢,就是这个节点的右子树中最左边的一个叶子节点。
其中 destroyNode是指删除指定空间。
完整代码如下: