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

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/9423709.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值