其他分享
首页 > 其他分享> > 数据结构—造树计划—二叉搜索树

数据结构—造树计划—二叉搜索树

作者:互联网

目录

数据结构—造树计划—二叉搜索树

定义

struct node{
	int val;
	node *lch, *rch;
};

功能

插入

node *insert(node *p, int x)
{
	if(p == NULL)
	{
		node *q = new node;
		q->lch = NULL; //q本来就是一个指向结构体node的指针 ,再用来指东西不过分吧? 
		q->rch = NULL;
		q->val = x;
		return q; 
	}
	else
	{
		if(x<p->val)
		{
			p->lch = insert(p->lch,x);//为什么是赋值给儿子结点呢?原结点已经与要加入的结点无缘了 
		}
		else p->rch = insert(p->rch,x);
		return p;//返回上一层函数,回去作报告 
	}
}

寻找

bool find(node* p,int x)
bool find(node* p,int x)
{
    //Null是在计算中具有保留的值,用于指示指针不引用有效对象
	if(p == NULL) return false;
	else if(x == p->val)return true;
	else if(x< p -> val) find(p->lch,x);
	else find(p->rch,x);
} 

删除

node * remove(node *p, int x)
{
    if(p==NULL)return NULL;
    else if(x<p->val) p->lch=remove(p->lch,x);
	else if(x>p->val) p->rch=remove(p->rch,x);
	else if(p->rch=NULL)
	{
		node *new_p=p->rch;
		delete p;
		return new_p;
	}	
	else if(p->lch->rch==NULL)
	{
		node *new_p=p->lch;
		new_p->rch=p->rch;//继承家产
		delete p;
		return new_p; 
	}	
	else
	{
		node *new_p=p->lch;
		while(new_p->rch->rch!=NULL)new_p=new_p->rch;//到最后一个点会保留一个右儿子,而这个右儿子是p结点左子树中最大的
		node *answer_p=new_p->rch;
		new_p->rch=answer_p->lch;//删除answer_p曾屈居点下的记录(左子结点上移) 
		answer_p->rch=p->rch;
		answer_p->rch=p->lch; 
		delete p;
		return answer_p;
    }	
    //注意,搜寻的过程也要记得返回更新的结点
	return p; 
} 

完整代码

#include<iostream>
using namespace std;
struct node{
	int val;
	node *lch, *rch;
};
node *insert(node *p, int x)
{
	if(p == NULL)
	{
		node *q = new node;
		q->lch = NULL; //q本来就是一个指向结构体node的指针 ,再用来指东西不过分吧? 
		q->rch = NULL;
		q->val = x;
		return q; 
	}
	else
	{
		if(x<p->val)
		{
			p->lch = insert(p->lch,x);//为什么是赋值给儿子结点呢?原结点已经与要加入的结点无缘了 
		}
		else p->rch = insert(p->rch,x);
		return p;//返回上一层函数,回去作报告 
	}
}
bool find(node* p,int x)
{
    //Null是在计算中具有保留的值,用于指示指针不引用有效对象
	if(p == NULL) return false;
	else if(x == p->val)return true;
	else if(x< p -> val) find(p->lch,x);
	else find(p->rch,x);
} 
node * remove(node *p, int x)
{
    if(p==NULL)return NULL;
    else if(x<p->val) p->lch=remove(p->lch,x);
	else if(x>p->val) p->rch=remove(p->rch,x);
	else if(p->rch=NULL)
	{
		node *new_p=p->rch;
		delete p;
		return new_p;
	}	
	else if(p->lch->rch==NULL)
	{
		node *new_p=p->lch;
		new_p->rch=p->rch;//继承家产
		delete p;
		return new_p; 
	}	
	else
	{
		node *new_p=p->lch;
		while(new_p->rch->rch!=NULL)new_p=new_p->rch;//到最后一个点会保留一个右儿子,而这个右儿子是p结点左子树中最大的
		node *answer_p=new_p->rch;
		new_p->rch=answer_p->lch;//删除answer_p曾屈居点下的记录(左子结点上移) 
		answer_p->rch=p->rch;
		answer_p->rch=p->lch; 
		delete p;
		return answer_p;
    }	
    //注意,搜寻的过程也要记得返回更新的结点
	return p; 
} 
int main()
{
	node *root = NULL;
	root = insert(root,1);
	find(root,1);
	return 0;
}

其他

参考资料

标签:node,结点,二叉,else,造树,rch,new,数据结构,lch
来源: https://www.cnblogs.com/BeautifulWater/p/14485535.html