二叉搜索树

来源:互联网 发布:武汉安天怎么样 知乎 编辑:程序博客网 时间:2024/05/17 08:24
       二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树。 它或者是一棵空树;或者是具有下列性质的二叉树(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结(3)左、右子树也分别为二叉排序树;
       二叉树的操作:
1.查找:
    例如查找7是否在上图的二叉树上;
    首先和根结点8比较,比8小,所以往左节点走,走到的的节点的值为3,比3大,所以往右节点走,走到的节点的值为6,比6大,则继续向右节点走,发现走到的节点的值和需要查找的值,相同,则查找结束;

2.插入:
    例如在上图的二叉树上插入9;
    这个操作盒查找很相似;首先个根节点8比较,比8大,所以往右节点走,走到的节点的值为10,比10小,所以往左节点走,发现无左节点所以,在节点值为10的左节点插入9,即9为10的左节点;

3.删除:
    需要根据下列情况分别进行处理:
    (1)需要删除的节点没有左儿子,那么就把右儿子提上去;
    (2)需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去;
    (3)以上两种情况都不满足的话,就把左儿子的子孙中最大的节点提到需要删除的节点上;
    例如要在上图的二叉树删除3;
    首先该节点有左儿子,所以直接把左儿子提上去即可;

4.二叉搜索树的实现:

//表示节点的结构体struct node{int val;node *lch,*ch;};//插入数值xnode *insert(node *p,int x){if (p==NULL){node *q=new node;q->val=x;q->lch=q->rch=NULL;return q;}else{if (x<p->val)p->lch=insert(p->lch,x);elsep->rch=insert(p->rch,x);return p;}}//查找数值xbool find(node *p,int x){if (p==NULL)return false;else{if (x==p->val)return true;else{if (x<p->val)return find(p->lch,x);elsereturn find(p->rch,x);}}}//删除数值xnode *remove(node *p,int x){if (p==NULL)return NULL;else{if (x<p->val)p->lch=remove(p-lrch,x);else{if (x>p->val)p->rch=remove(p->rch,x);else{//找到数值x所在的节点if (p->lch==NULL){//需要删除的节点没有左儿子,那么就把右儿子提上去;node *q=p->rch;delete p;return q;}else{//需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去;if (p->lch->rch==NULL){node *q=p->lch;q->rch=p->rch;delete p;return q;}else{//需要删除的节点有左儿子&需要删除的节点的左儿子有右儿子,就把左儿子的子孙中最大的节点提到需要删除的节点上;node *q;for (q=p->lch;q->rch->rch!=NULL;q=q->rch);node *r=q->rch;q->rch=r->lch;r->lch=p->lch;r->rch=p->rch;delete p;return r;}}}}return p;}}


1 1
原创粉丝点击