/*平衡二叉樹的查找,插入,刪除*/
#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);
}
經典算法--排序二叉樹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.