0. 中序遍历时的后继节点(successor)
如当前节点为
- 右子树非空,则其后继为其右子树的最左节点(最小值所在的节点)
右子树为空,则其后继为该节点的最底层的祖先节点;
BST_SUCCESSOR(x) if x.right != NIL return BST_MINIMUM(x.right) y = x.p while y != NIL && x == y.right x = y y = y.p return y
其中搜索最小关键字元素算法如下:
BST_MINIMUM(x)
while x != NIL && x.left != NIL
x = x.left
return x
1. 一路沿左分支遍历
// BinNode<T>* x;
while (x){
visit(x->data); // 有点先序的例子了
S.push(x);
x = x->lChild;
}
// 直到到达最左,或者为叶子结点,或者为没有左孩子,右孩子的内部结点;
// 总之,都是最左的结点;
- 当然,与之相对应的右分支可以用 Stack 存储,也可以使用 Queue,视具体的程序逻辑而定;
2. 二叉搜索树的 search 与 insert
因为是二叉搜索树,所以是排过序的。当要插入一个元素时,一定要插入在合适的位置,而插入的位置由 search 确定:
template <typename T>
BinNode<T>*& search_rec(BinNode<T>* x, const T& e, BinNode<T>*& hot){
if (!x || (e == x->data)) return x;
// 查找到该元素,或者应该出现的位置为空节点,而这个位置就作为插入的位置;
hot = x; // 保存当前结点,经过前面的 if,当前结点显然不是要返回的点,也即分别在左右孩子中
return e < x->data ? search_rec(x->lChild, e, hot) : search_rec(x->rChild, e, hot);
}
// _root, _hot 均为私有成员变量
template <typename T>
BinNode<T>*& BST<T>::search(const T& e){
return search_rec(_root, e, _hot = NULL);
}
template <typename T>
BinNode<T>* BST<T>::insert(const T& e){
BinNode<T>* x = search(e);
if (x->data == e) return x;
x = new BinNode<T>(e, _hot);
++_size;
updateHeightAbove(x);
return x;
}