二叉树的常用操作(节点的后继节点)

0. 中序遍历时的后继节点(successor)

如当前节点为 x,其后继节点包含两种情况:

  • 右子树非空,则其后继为其右子树的最左节点(最小值所在的节点)
  • 右子树为空,则其后继为该节点的最底层的祖先节点;

    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;
}
原文地址:https://www.cnblogs.com/mtcnn/p/9423710.html