二叉查找树和AVL树

二叉查找树

定义:

二叉查找树(二叉排序树)或者是一棵空树,或者是具有下列性质的二叉树: 

  1. 每个结点都有一个作为查找依据的关键字(key),所有结点的关键字互不相同。
  2.  左子树(若非空)上所有结点的关键字都小于根结点的关键字。
  3. 右子树(若非空)上所有结点的关键字都大于根结点的关键字。  
  4. 左子树和右子树也是二叉查找树
如果对一棵二叉查找树进行中序遍历,可以按从小到大的顺序,将各结点关键字排列起来


AVL树 高度平衡的二叉查找树

定义:
一棵AVL树或者是空树,或者是具有下列性质的二叉查找树:它的左子树和右子树都是AVL树,且左子树和右子树的高度之差的绝对值不超过1。
叉查找树上的构建

二叉查找树上的构建:

 1.构造过程: 从空树出发,依次插入R1~ Rn各数据值: (1)如果二叉查找树是空树,则插入结点就 是二叉查找树的根结点; (2)如果二叉查找树是非空的,则插入值与 根结点比较,若小于根结点的值,就插 入到左子树中去;否则插入到右子树 中。


查找树代码(函数实现形式):

#include <iostream>
using namespace std;
//定义元素
typedef struct{
    int key;
}ElemType;
//定义节点
typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild, *rchild;
//    BiTNode(int d = 0, struct BiTNode* l = NULL, struct BiTNode* r = NULL) : data(d), lchild(l), rchild(r) {}
}BiTNode, *BiTree;


//插入查找树
void insert_BST(BiTree& T, BiTree S){
    BiTree p, q;
    if(!T) T = S;
    else {
        p = T;
        while(p) {
            q = p;
            if(S->data.key < p->data.key) p = p->lchild;
            else p = p->rchild;
        }
        if(S->data.key < q->data.key) q->lchild = S;
        else q->rchild = S;
    }
}
//查找节点,插入节点
int search_BST(BiTree& T, int key){
    BiTree p = T, q, S;
    while(p){
        if(p->data.key == key) return 1;
        else if(p->data.key > key){ q = p; p = p->lchild; }
        else { q = p; p = p->rchild; }
    }
    S = new BiTNode;
    S->data.key = key;
    S->lchild = S->rchild = NULL;
    if(!T) T = S;
    else if(key < q->data.key) q->lchild = S;
    else q->rchild = S;
    return 0;
}
//删除节点
void delNode(BiTree &T, BiTree p, BiTree f){
    BiTree s, q;
    int tag = 0;
    if(!p->lchild) s = p->rchild;
    else if(!p->rchild) s = p->lchild;
        else{
            q = p; s = p->rchild;
            while(s->rchild) {q = s; s = s->rchild; }
            p -> data = s->data;
            if(p == q) q->lchild = s->lchild;
            else q->rchild =s->lchild;
        }
        if(!tag){
            if(!f) T = s;
            else if(f->lchild == p) f->lchild = s;
            else f->rchild = s;
            delete p;
        }
}
//从二叉查找树上删除节点
int delete_BST(BiTree &T, int key){
    BiTree p, f;
    p = T; p = NULL;
    while(p){
        if(p->data.key == key) { delNode(T, p, f); return 1; }
        else if(p->data.key > key) { f = p; p = p->lchild; }
        else { f = p; p = p->rchild; }
    }
    return 0;
}
//中序遍历
void travel_BST(const BiTree& T){
    if(!T) return;
    travel_BST(T->lchild);
    cout << T->data.key << " ";
    travel_BST(T->rchild);
}


int main(){
    int key[10] = {11, 2, 3, 54, 66, 123, 5, 9, 18, 83};
    BiTree T = NULL;
    cin >> key[0];
    for(int i = 0; i < 10; i++) search_BST(T, key[i]);
    travel_BST(T);
    //for(int i = 0; i < 10; i++) delete_BST(T, key[i]);
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值