• 二分搜索树删除节点


    #include <iostream>
    #include <queue>
    #include <cassert>

    using namespace std;

    template <typename Key, typename Value>
    class BST{

    private:
    struct Node{
    Key key;
    Value value;
    Node *left;
    Node *right;

    Node(Key key, Value value){
    this->key = key;
    this->value = value;
    this->left = this->right = NULL;
    }

    Node(Node *node){
    this->key = node->key;
    this->value = node->value;
    this->left = node->left;
    this->right = node->right;
    }
    };

    Node *root;
    int count;

    public:
    BST(){
    root = NULL;
    count = 0;
    }
    ~BST(){
    destroy( root );
    }

    int size(){
    return count;
    }

    bool isEmpty(){
    return count == 0;
    }

    void insert(Key key, Value value){
    root = insert(root, key, value);
    }

    bool contain(Key key){
    return contain(root, key);
    }

    Value* search(Key key){
    return search( root , key );
    }

    // 前序遍历
    void preOrder(){
    preOrder(root);
    }

    // 中序遍历
    void inOrder(){
    inOrder(root);
    }

    // 后序遍历
    void postOrder(){
    postOrder(root);
    }

    // 层序遍历
    void levelOrder(){

    queue<Node*> q;
    q.push(root);
    while( !q.empty() ){

    Node *node = q.front();
    q.pop();

    cout<<node->key<<endl;

    if( node->left )
    q.push( node->left );
    if( node->right )
    q.push( node->right );
    }
    }

    // 寻找最小的键值
    Key minimum(){
    assert( count != 0 );
    Node* minNode = minimum( root );
    return minNode->key;
    }

    // 寻找最大的键值
    Key maximum(){
    assert( count != 0 );
    Node* maxNode = maximum(root);
    return maxNode->key;
    }

    // 从二叉树中删除最小值所在节点
    void removeMin(){
    if( root )
    root = removeMin( root );
    }

    // 从二叉树中删除最大值所在节点
    void removeMax(){
    if( root )
    root = removeMax( root );
    }

    // 从二叉树中删除键值为key的节点
    void remove(Key key){
    root = remove(root, key);
    }

    private:
    // 向以node为根的二叉搜索树中,插入节点(key, value)
    // 返回插入新节点后的二叉搜索树的根
    Node* insert(Node *node, Key key, Value value){

    if( node == NULL ){
    count ++;
    return new Node(key, value);
    }

    if( key == node->key )
    node->value = value;
    else if( key < node->key )
    node->left = insert( node->left , key, value);
    else // key > node->key
    node->right = insert( node->right, key, value);

    return node;
    }

    // 查看以node为根的二叉搜索树中是否包含键值为key的节点
    bool contain(Node* node, Key key){

    if( node == NULL )
    return false;

    if( key == node->key )
    return true;
    else if( key < node->key )
    return contain( node->left , key );
    else // key > node->key
    return contain( node->right , key );
    }

    // 在以node为根的二叉搜索树中查找key所对应的value
    Value* search(Node* node, Key key){

    if( node == NULL )
    return NULL;

    if( key == node->key )
    return &(node->value);
    else if( key < node->key )
    return search( node->left , key );
    else // key > node->key
    return search( node->right, key );
    }

    // 对以node为根的二叉搜索树进行前序遍历
    void preOrder(Node* node){

    if( node != NULL ){
    cout<<node->key<<endl;
    preOrder(node->left);
    preOrder(node->right);
    }
    }

    // 对以node为根的二叉搜索树进行中序遍历
    void inOrder(Node* node){

    if( node != NULL ){
    inOrder(node->left);
    cout<<node->key<<endl;
    inOrder(node->right);
    }
    }

    // 对以node为根的二叉搜索树进行后序遍历
    void postOrder(Node* node){

    if( node != NULL ){
    postOrder(node->left);
    postOrder(node->right);
    cout<<node->key<<endl;
    }
    }

    void destroy(Node* node){

    if( node != NULL ){
    destroy( node->left );
    destroy( node->right );

    delete node;
    count --;
    }
    }

    // 在以node为根的二叉搜索树中,返回最小键值的节点
    Node* minimum(Node* node){
    if( node->left == NULL )
    return node;

    return minimum(node->left);
    }

    // 在以node为根的二叉搜索树中,返回最大键值的节点
    Node* maximum(Node* node){
    if( node->right == NULL )
    return node;

    return maximum(node->right);
    }

    // 删除掉以node为根的二分搜索树中的最小节点
    // 返回删除节点后新的二分搜索树的根
    Node* removeMin(Node* node){

    if( node->left == NULL ){

    Node* rightNode = node->right;
    delete node;
    count --;
    return rightNode;
    }

    node->left = removeMin(node->left);
    return node;
    }

    // 删除掉以node为根的二分搜索树中的最大节点
    // 返回删除节点后新的二分搜索树的根
    Node* removeMax(Node* node){

    if( node->right == NULL ){

    Node* leftNode = node->left;
    delete node;
    count --;
    return leftNode;
    }

    node->right = removeMax(node->right);
    return node;
    }

    // 删除掉以node为根的二分搜索树中键值为key的节点
    // 返回删除节点后新的二分搜索树的根
    Node* remove(Node* node, Key key){

    if( node == NULL )
    return NULL;

    if( key < node->key ){
    node->left = remove( node->left , key );
    return node;
    }
    else if( key > node->key ){
    node->right = remove( node->right, key );
    return node;
    }
    else{ // key == node->key

    if( node->left == NULL ){
    Node *rightNode = node->right;
    delete node;
    count --;
    return rightNode;
    }

    if( node->right == NULL ){
    Node *leftNode = node->left;
    delete node;
    count--;
    return leftNode;
    }

    // node->left != NULL && node->right != NULL
    Node *successor = new Node(minimum(node->right));  // 注意此处的new一个新的Node不然会被removeMin所删除;

    count ++;

    successor->right = removeMin(node->right);
    successor->left = node->left;

    delete node;
    count --;

    return successor;
    }
    }
    };


    void shuffle( int arr[], int n ){

    srand( time(NULL) );
    for( int i = n-1 ; i >= 0 ; i -- ){
    int x = rand()%(i+1);
    swap( arr[i] , arr[x] );
    }
    }

    int main() {

    srand(time(NULL));
    BST<int,int> bst = BST<int,int>();

    int n = 10000;
    for( int i = 0 ; i < n ; i ++ ){
    int key = rand()%n;
    // 为了后续测试方便,这里value值取和key值一样
    int value = key;
    //cout<<key<<" ";
    bst.insert(key,value);
    }

    // test remove
    // remove elements in random order
    int order[n];
    for( int i = 0 ; i < n ; i ++ )
    order[i] = i;
    shuffle( order , n );

    for( int i = 0 ; i < n ; i ++ )
    if( bst.contain( order[i] )){
    bst.remove( order[i] );
    cout<<"After remove "<<order[i]<<" size = "<<bst.size()<<endl;
    }

    return 0;
    }

  • 相关阅读:
    python不是内部或外部命令
    Fix: The account is not authorized to log in from this station
    mac 下安装caffe(一)
    mac下安装tensorflow及入门例子
    tensorflow移植到ios
    ios添加麦克风访问权限
    ios 使用Starscream实现websocket简单例子
    使用Carthage安装及使用第三方库
    Homebrew 命令
    mac Homebrew Updating慢,替换及重置Homebrew默认源
  • 原文地址:https://www.cnblogs.com/ZhiHao-queue/p/9436156.html
Copyright © 2020-2023  润新知