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


    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;
    }
  • 相关阅读:
    hdu 1690
    hdu 2962
    hdu 2923
    hdu 1385
    hdu 1505
    python:获取访问访问时的响应时间
    自动化脚本编写环境部署_win7(RF)
    python操作浏览器及截图小结
    Python + Selenium 实现对页面的指定元素截图(可截长图元素)【转载】
    Linux:DNS服务器搭建及配置
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9423709.html
Copyright © 2020-2023  润新知