zoukankan      html  css  js  c++  java
  • 二叉树的常用操作(节点的后继节点)

    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;
    }
  • 相关阅读:
    linux系统日志及其rsyslog服务
    C++
    程序员之---C语言细节18(一些奇怪表达式)
    Spring MVC的简单使用方法
    Android系统开发(4)——Autotools
    大话设计模式C++版——代理模式
    JS获取地址栏并拼接參数
    二叉树的应用(1)--二叉树排序树基本操作
    【LeetCode-面试算法经典-Java实现】【067-Add Binary(二进制加法)】
    Android 实现形态各异的双向側滑菜单 自己定义控件来袭
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9423710.html
Copyright © 2011-2022 走看看