二叉搜索树的搜索、排序、插入、删除

本文详细介绍了二叉树的基本操作,包括插入、遍历、查找最大最小值等,并提供了完整的C++实现代码。通过示例展示了如何构建二叉树、进行中序遍历排序以及搜索特定值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>  
#include<stack>
#define MAXLINE 5
using namespace std;  
struct Node
{
	int data;
	struct Node * lchild;
	struct Node * rchild;
};
void insertBinaryTree(struct Node *root,int data)
{
	struct Node *p1,*p2,*pData;
	pData=(struct Node *)malloc(sizeof(struct Node));
	pData->data=data;
	pData->lchild=NULL;
	pData->rchild=NULL;
	p1=p2=root;
	while(p1)
	{	
		p2=p1;
		if(p1->data>data)	//左子树
			p1=p1->lchild;
		else
			p1=p1->rchild;
	}
	if(p2->data>data)		//数据放在p2的左子树上.
		p2->lchild=pData;
	else
		p2->rchild=pData;
}
struct Node * getFatherNode(struct Node *root,struct Node *pData)
{
	struct Node *p1,*p2;
	p1=root;
	p2=NULL;
	while(p1 && p1!=pData)
	{
		p2=p1;
		if(p1->data>pData->data)
			p1=p1->lchild;
		else if(p1->data<pData->data)
			p1=p1->rchild;
		else if(p1->lchild->data==pData->data)		//左子树搜索
			p1=p1->lchild;
		else if(p1->rchild->data==pData->data)
			p1=p1->rchild;
	}
	if(!p1)
		return NULL;
	return p2;
}
struct Node * getSuccessor(struct Node * root,struct Node *pData)		//寻找后继节点
{
	struct Node *p;
	if(pData->rchild)
	{
		p=pData->rchild;
		while(p->lchild)
			p=p->lchild;
		return p;
	}
	p=getFatherNode(root,pData);
	while(!p && p->rchild==pData)
	{
		pData=p;
		p=getFatherNode(root,p);
	}
	return p;
}
struct Node *getPredecessor(struct Node *root,struct Node *pData)		//寻找前驱节点
{
	struct Node *p;
	if(pData->lchild)
	{
		p=pData->lchild;
		while(p->rchild)
			p=p->rchild;
		return p;
	}
	p=getFatherNode(root,pData);
	while(!p && p->lchild==pData)
	{
		pData=p;
		p=getFatherNode(root,p);
	}
	return p;
}

struct Node * createBinaryTree(int *array,int n)
{
	if(n<=0)
		return NULL;
	struct Node *root;
	root=(struct Node *)malloc(sizeof(struct Node));
	root->data=array[0];
	root->rchild=NULL;
	root->lchild=NULL;
	int i=1;
	for(i=1;i<n;i++)
		insertBinaryTree(root,array[i]);
	return root;
}
#if 0
void print(struct Node *root)
{
	if(!root)
		return;
	print(root->lchild);
	cout<<root->data<<" ";
	print(root->rchild);
}
#endif
void inorderTraversal(struct Node *root)
{
	stack<struct Node *>st;
	struct Node *p=root;
	struct Node *pData;
	st.push(root);
	while(!st.empty())		//只要堆栈非空
	{
		p=st.top();
		while(p)
		{
			st.push(p->lchild);
			p=p->lchild;
		}					//让p指向最左子节点的左子节点
		st.pop();			//空指针堆栈;
		if(!st.empty())
		{
			pData=st.top();			//要访问的元素
			cout<<pData->data<<" ";
			st.pop();
			st.push(pData->rchild);
		}
	}
}
struct Node * maxBinaryTree(struct Node *root)
{
	struct Node *p=root;
	while(p->rchild)
		p=p->rchild;
	return p;
}
struct Node * minBinaryTree(struct Node *root)
{
	struct Node *p=root;
	while(p->lchild)
		p=p->lchild;
	return p;
}
struct Node * binarySearch(struct Node *root,int data)
{
	struct Node *p=root;
	while(p)
	{
		if(p->data>data)		//在左子树上
			p=p->lchild;
		else if(p->data<data)	//在右子树上
			p=p->rchild;
		else					//找到
			return p;
	}
	return NULL;
}
void deleteBinaryTree(struct Node *root,int data)
{
	struct Node *pData=root,*p;
	pData=binarySearch(root,data);//p指向要删除的节点.
	if(!pData)			//p==NULL表示未找到元素data
		return;
	p=pData;
	if(pData->lchild && pData->rchild)	//左孩子右孩子均存在则删除其后继节点,然后将后继节点的值放到pData中
		p=getSuccessor(root,pData);
	//删除节点p,可以确定p节点只有一个孩子后者没有孩子
	struct Node *pFather;
	if(!p->lchild && !p->rchild)		//左孩子右孩子都不存在
	{
		pFather=getFatherNode(root,p);
		if(pFather->lchild==p)
			pFather->lchild=NULL;
		else 
			pFather->rchild=NULL;
	}
	else if(p->rchild && !p->lchild)	//右孩子存在
	{
		pFather=getFatherNode(root,p);
		if(pFather->lchild==p)
			pFather->lchild=p->rchild;
		else
			pFather->rchild=p->rchild;
	}
	else if(!p->rchild && p->lchild)		//左孩子存在
	{
		pFather=getFatherNode(root,p);
		if(pFather->lchild==p)
			pFather->lchild=p->lchild;
		else 
			pFather->rchild=p->lchild;
	}

	if(pData->lchild && pData->rchild)
		pData->data=p->data;
	return ;
}
int _tmain(int argc, _TCHAR* argv[])
{
	
	int array[MAXLINE];
	cout<<"please input "<<MAXLINE<<" numbers"<<endl;
	int i=0;
	for(i=0;i<MAXLINE;i++)
		cin>>array[i];
	cout<<"the numbers input are:"<<endl;
	for(i=0;i<MAXLINE;i++)
		cout<<array[i]<<" ";
	cout<<endl;

	cout<<"numbers ordered are:"<<endl;						
	struct Node *root=createBinaryTree(array,MAXLINE);	//构建二叉树
	inorderTraversal(root);							//排序

	struct Node *p=maxBinaryTree(root);					//查找最大值
	cout<<endl<<"max of binary tree is "<<p->data<<endl;

	p=minBinaryTree(root);								//查找最小值
	cout<<"min of binary tree is "<<p->data<<endl;
	
	cout<<"please input the number you want to search"<<endl;
	int data;
	cin>>data;
	p=binarySearch(root,data);							//二叉树查找指定值
	if(p)
	{
		cout<<"find data "<<p->data<<endl;
		cout<<"it's predecessor is "<<getPredecessor(root,p)->data<<endl;
		cout<<"it's successor is "<<getSuccessor(root,p)->data<<endl;
		deleteBinaryTree(root,p->data);
		inorderTraversal(root);
	}
	else
		cout<<"can't find data "<<data<<endl;
	cin.get();
	cin.get();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值