查找二叉树的创建插入查找删除

#include<iostream>
using namespace std;

typedef int ElemType;

typedef struct Node
{
	ElemType  data;
	struct Node *lchild;
	struct Node *rchild;
}*BSTree;



bool search_BSTree(BSTree pTree,int key,BSTree parent,BSTree &p) 
{
	if(!pTree)
	{
		p=parent;
		return false;
	}else
	{
		if(key==pTree->data)
		{
			p=pTree;
			return true;
		}else if(key<pTree->data)
		{
			return search_BSTree(pTree->lchild,key,pTree,p); 
		}
		else
		{
			return search_BSTree(pTree->rchild,key,pTree,p); 
		}
	}

}


bool insertNode(BSTree &pTree,int v)//特别注意:这里传入的是引用,如果不是引用将出错
{
	cout<<"进来插入了了。。。"<<endl;
	BSTree p;
	if(!search_BSTree(pTree,v,NULL,p))
	{
		BSTree bt=(BSTree)malloc(sizeof(Node));
		bt->data=v;
		bt->lchild=NULL;
		bt->rchild=NULL;

		if(!p)
		{

			pTree=bt;
			cout<<"pTree"<<pTree->data<<endl;
		}
		else if(v<p->data)
		{
			p->lchild=bt;
		}
		else
		{
			p->rchild=bt;
		}
		return true;
	}

	else
		return false;
}


BSTree create_BSTree(int *a,int num)
{
	cout<<"进来创建二叉树了。。"<<endl;
	BSTree p=NULL;
	for(int i=0;i<num;i++)
	{
		cout<<"*(a+i)"<<*(a+i)<<endl;
		insertNode(p,*(a+i));
	}
	return p;
}


void in_traverse(BSTree t)
{
	if(t)
	{
		if(t->lchild)
		in_traverse(t->lchild);
		cout<<t->data<<endl;
		if(t->rchild)
		in_traverse(t->rchild);
	}
}


void del_node(BSTree &p)
{
	BSTree q,s;
	if(!p->lchild)
	{
		q=p;
		p=p->rchild;
		free(q);
	}
	else if(!p->rchild)
	{
		q=p;
		p=p->rchild;
		free(q);
	}
	else
	{
		s=p->lchild;
		while(s->rchild)
		{
			s=s->rchild;
			
		}
		s->rchild=p->rchild;
			q=p;
			p=p->lchild;
			free(q);
	}
}


bool del_nodeFromTree(BSTree &pTree,int key)
{
	if(!pTree)
	{
		return false;
	}
	else
	{
		if(key==pTree->data)
		{
			del_node(pTree);
			return true;
		}
		else if(key<pTree->data)
		{
			return del_nodeFromTree(pTree->lchild,key);
		}
		else
		{
			return del_nodeFromTree(pTree->rchild,key);
		}
	}
}

void main()
{
	BSTree t;
	int num;
	int b;

	cout<<"请输入创建的树的结点数目"<<endl;
	cin>>num;
	int *a=(int*)malloc(sizeof(int)*num);
	cout<<"请输入要插入的值"<<endl;
	for(int i=0;i<num;i++)
	{
		cin>>a[i];
		cout<<"a[i]"<<a[i]<<endl;
	}

	t=create_BSTree(a,num);

	//中序遍历创建的二叉查找树
	cout<<"遍历得到的结果为"<<endl;
	in_traverse(t); 
	cout<<"请输入要删除的结点"<<endl;
	
	cin>>b;
	del_nodeFromTree(t,b);
	cout<<"删除结点后的遍历得到的结果为"<<endl;
	in_traverse(t); 
	system("pause");
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值