二叉树------二叉查找树的相关内容

来源:互联网 发布:sql注入分析 编辑:程序博客网 时间:2024/04/30 10:16
  1. 性质
    1. 若它的左子树不为空,则左子树上所有的结点值均小于它根结点的值;
    2. 若它的右子树不为空,则右子树上所有的结点值均大于它根结点的值;
    3. 它的左、右子树也都是二叉查找树。
  2. 二叉查找树的相关操作
    1.二叉树的二叉链表结点结构定义
typedef struct BiTNode{    int data;    struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;
   2. 查找操作
/*递归的查找二叉查找树T中是否有key,指针f指向T的父结点,其初始值为NULL。若查找成功,则指针p指向该结点,并返回true。否则,指针p指向查找路径上访问的最后一个结点并返回false */bool searchBST(BiTree T, int key, BiTree f, BiTree *p){    if(!T){        *p = f;        return false;    }    else if(key == T->data){        *p = T;        return true;    }    else if(key < T->data){        return searchBST(T->lchild, key, T, p);    }    else{        return searchBST(T->rchild, key, T, p);    }}
    3.插入操作
bool insertBST(BiTree* T, int key){    BiTree p, s;    if(!searchBST(*T, key, NULL, &p)){        s = (BiTree)malloc(sizeof(BiTNode));        s->data = key;        s->lchild = s->rchild = NULL;        if(!p)            *T = s;        else if(key < p->data)            p->lchild = s;        else            p->rchild = s;        return true;    }    else        return false;}
     4. 构建一棵二叉查找树
BiTree makeTree(int *arr, int len){    int i;    if(arr == NULL || len < 1){        return NULL;    }    BiTree T = NULL;    for(i = 0; i < len; i++){        insertBST(&T, arr[i]);      }    return T;}
      5.二叉查找树的删除
/*分三种情况:  1> 是叶子结点;            2> 仅有左或右子树的结点;            3> 左右子树都有的结点;*/bool deleteBST(BiTree* T, int key){    if(!*T)        return false;    else{        if(key == (*T)->data)            return Delete(T);        else if(key < (*T)->data)            return deleteBST(&(*T)->lchild, key);        else            return deleteBST(&(*T)->rchild, key);    }}bool Delete(BiTree* p){    BiTree q, s;    if((*p)->rchild == NULL){ //若右子树为空,则将左子树放到当前位置,并删除结点        q = *p;        *p = (*p)->lchild; //注意此处        free(q);    }    else if((*p)->lchild == NULL){        q = *p;        *p = (*p)->rchild;        free(q);    }    else{ //当左右子树都不为空时,要找到要删除结点的直接前驱,用它来代替要删除结点的位置        q = *p;        s = (*p)->lchild;        while(s->rchild){            q = s;            s = s->rchild;        }        (*p)->data = s->data; //直接前驱就是要删除结点的左子树的最右边结点        if(q != *p)            q->rchild = s->lchild;        else            q->lchild = s->lchild;        free(s);    }    return true;}
1 0