經典算法--排序二叉樹

/*平衡二叉樹的查找,插入,刪除*/
#include<iostream>
using namespace std;
struct Node{
	Node *lchild,*rchild;
	int data;
	Node(){
		lchild=NULL;
		rchild=NULL;
	}
};
void CopyNode(Node *&node1,Node *& node2){//複製節點
	node1->data=node2->data;
	node1->lchild=node2->lchild;
	node1->rchild=node2->rchild;
}
bool InsertNode(Node * & node,int &data){//插入值
	if(!node){
		node=new Node;
		node->data=data;
		return true;
	}
	if(node->data==data)
		return false;
	if(node->data>data)
		return InsertNode(node->lchild,data);
	else
		return InsertNode(node->rchild,data);
}
bool InsertNode(Node * & node,Node* &data){//插入節點
	if(!node){
		node=new Node;
		CopyNode(node,data);
		return true;
	}
	if(node->data>data->data)
		return InsertNode(node->lchild,data);
	else
		return InsertNode(node->rchild,data);
}
Node *SearchNode(Node * &node,int &data){//找查結點
	if(!node){
		InsertNode(node,data);//查找不成功,則將此結點插入二叉樹
		return node;
	}
	if(node->data==data)
		return node;//返回查找成功的結點
	if(node->data>data)
		return SearchNode(node->lchild,data);
	else
		return SearchNode(node->rchild,data);
}
void Delete(Node *&node){
	if(!node->lchild&&!node->rchild){//左右子樹都爲空的情況
			delete node;
			node=NULL;
		}
		else if(node->lchild!=NULL&&!node->rchild){//左不爲空,右爲空的情況
			Node *p=node->lchild;
			CopyNode(node,p);
			delete p;
		}
		else if(node->rchild!=NULL&&!node->lchild){//右不爲空,左爲空的情況{
			Node *p=node->rchild;
			CopyNode(node,p);
			delete p;
		}
		else{
			Node *lp=node->lchild;
			Node *rp=node->rchild;
			Node *p=node->lchild;
			CopyNode(node,lp);
			delete lp;
			InsertNode(node,rp);
			delete rp;
		}
}
bool DeleteNode(Node *&node,int data){//找到要被刪除的結點
	if(!node)
		return false;
	if(node->data==data){
		Delete(node);
		return true;
	}
	else if(node->data>data)
		return DeleteNode(node->lchild,data);
	else
		return DeleteNode(node->rchild,data);

}
/*先序遍歷和中中序遍歷可確定一棵二叉樹*/
void Print1(Node *&node){//先序遍歷
	if(!node)
		return ;
	cout<<node->data<<"  ";
	Print1(node->lchild);
	Print1(node->rchild);
}
void Print2(Node *&node){//中序遍歷
	if(!node)
		return ;
	Print2(node->lchild);
	cout<<node->data<<"  ";
	Print2(node->rchild);
}
int main(){
	Node *node=NULL;  
	int array[]={8,4,2,6,1,3,5,7,12,10,14,9,11,13,15};//一棵平衡滿二叉樹
	for(int i=0;i<15;i++)
		SearchNode(node,array[i]);
	DeleteNode(node,4);
	DeleteNode(node,15);
	DeleteNode(node,14);
	Print1(node);
	cout<<endl;
	Print2(node);
}


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