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

二叉搜索树

时间:2014-11-14 15:47:23      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:算法   编程   c++   二叉树   

       二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树。 它或者是一棵空树;或者是具有下列性质的二叉树(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结(3)左、右子树也分别为二叉排序树;
bubuko.com,布布扣
       二叉树的操作:
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;
};

//插入数值x
node *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);
		else
			p->rch=insert(p->rch,x);
		return p;
	}
}

//查找数值x
bool 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);
			else
				return find(p->rch,x);
		}
	}
}

//删除数值x
node *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;
	}
}


二叉搜索树

标签:算法   编程   c++   二叉树   

原文地址:http://blog.csdn.net/codeforcer/article/details/41117915

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