码迷,mamicode.com
首页 > 其他好文 > 详细

二叉搜索树

时间:2021-05-23 23:08:30      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:第一个   树的操作   out   turn   size   中序   insert   最小   最小值   

二叉搜索树

二叉搜索树满足这样的性质:

  1. 每个节点 x 有一个键值。
  2. 节点 x 的键值大于等于左子树的任意节点 y 的键值.
  3. 节点 x 的键值小于等于右子树的任意节点 z 的键值.

二叉搜索树的表达

struct Node{
    int key;
    Node*parent ;
    Node*left;
    Node*right;
};
Node*root,*NIL;

二叉搜索树的操作(插入查找删除都是O(h),h为树高)

插入
找到合适的位置,然后添加节点。

void insert(int k){
    Node* cur = root;//用于记录当前搜到哪里
    Node* par = NIL;//用于记录这个插入的节点的父亲节点
    Node* z = (Node *)malloc(sizeof(Node));
    z->key = k;
    z->left = NIL;
    z->right = NIL;
    while(cur != NIL){
        par = cur;
        if(z->key < cur->key) cur = cur->left;
        else cur = cur->right;
    }
    z->parent=par;
    if(par == NIL){
        root = z;
    }else{
        if(z->key < par->key){
            par->left = z;
        }else{
            par->right = z;
        }
    }
}

查找
根据二叉搜索树的性质,每次选择合适的分支,最后搜到 NIL 说明失败。

Node* find(int k){
    Node *cur = root;
    while(cur != NIL && cur->key != k){
        if(k < cur->key)cur = cur->left;
        else cur = cur->right;
    }
    return cur;
}

求最小值

Node * treeMinimum(Node *x){
    while(x->left != NIL) x= x->left;
    return x;
}

求后一个节点(在中序遍历时后一个输出的)

Node * treeSuccessor(Node* x){
    if(x->right != NIL)return treeMinimum(x->right);
    Node* y = x->parent;
    while(y != NIL && x == y->right){//网上找,找到第一个比它(x)大的
        x = y;
        y=y->parent;
    }
    return y;
}

删除节点

void deleteNode(Node * z){
    Node *y;//要删除的对象
    Node* x;//y的子节点
    
    //确定要删除的节点
    if(z->left == NIL || z->right == NIL) y = z;
    else y = treeSuccessor(z);
    //确定y的子节点x
    if(y->left != NIL){
        x = y->left;
    }else{
        x = y->right;
    }
    
    if(x != NIL){
        x->parent = y->parent;
    }
    
    if(y->parent == NIL){
        root = x;
    }else{
        if(y == y->parent->left){
            y->parent->left = x;
        }else{
            y->parent->right = x;
        }
    }
    
    if(y != z){
        z->key = y->key;
    }
    
    free(y);
}

中序遍历

void inorder(Node* u){
    if(u == NIL)return;
    inorder(u->left);
    cout<<" "<<u->key;
    inorder(u->right);
}

前序遍历

void preorder(Node* u){
    if(u == NIL)return;
    cout<<" "<<u->key;
    preorder(u->left);
    preorder(u->right);
}

二叉搜索树

标签:第一个   树的操作   out   turn   size   中序   insert   最小   最小值   

原文地址:https://www.cnblogs.com/Softwarer1412/p/14727696.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!