查找二叉樹的創建插入查找刪除

#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");
}

發佈了54 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章