二叉树的一般操作
#include <iostream>
using namespace std;
#include <queue>
struct BiNode{
char data;
BiNode *lchild;
BiNode *rchild;
};
/*BiNode* creatBiNode() //2 1 # # 3 # #先序遍历二叉树
{
char a;
cin>>a;
//cout<<a<<endl;
BiNode *p=new BiNode;
if(a=='#')
p=NULL;
else{
p->data=a;
p->lchild=creatBiNode();
p->rchild=creatBiNode();
}
return p;
}*/
BiNode* creatBiNode(char a[],int &i){ //先序遍历创建二叉树 //创建二叉树
char t=a[i];
i++;
cout<<t<<endl;
BiNode *p;
if(t=='#')
p=NULL;
else{
p=new BiNode;
p->data=t;
p->lchild=creatBiNode(a,i);
p->rchild=creatBiNode(a,i);
}
return p;
}
BiNode* creatBiNode2(char a[],char b[],int n){//先序和中序构造二叉树
BiNode *p=new BiNode; //根 左 右
p->data=a[0]; //左 根 右
int i=0;
/*for(;;)
{
if(a[n]==NULL) //指针才能判断这个为NULL
break;
else
n++;
}*/
for(;;) //计算左子树的个数
{
if(a[0]==b[i])
break;
else
i++;
}
if(i!=0){ //如果有左子树递归
char a1[i],b1[i];
for(int j=0;j<i;j++)
{
a1[j]=a[j+1];
b1[j]=b[j];
}
p->lchild=creatBiNode2(a1,b1,i);
}
else //没有左子树为NULL
p->lchild=NULL;
if(n!=i+1){
char a2[n-i-1],b2[n-i-1];
for(int j=0;j<n-i-1;j++)
{
a2[j]=a[j+i+1];
b2[j]=b[j+i+1];
}
p->rchild=creatBiNode2(a2,b2,n-i-1);
}
else
p->rchild=NULL;
return p;
}
void PreOrder(BiNode *p){ //先序遍历
if(p==NULL)return;
cout<<p->data<<" ";
PreOrder(p->lchild);
PreOrder(p->rchild);
}
void InOrder(BiNode *p){ //中序遍历
if(p==NULL)return;
InOrder(p->lchild);
cout<<p->data<<" ";
InOrder(p->rchild);
}
void PostOrder(BiNode *p){ //后序遍历
if(p==NULL)return;
PostOrder(p->lchild);
PostOrder(p->rchild);
cout<<p->data<<" ";
}
void LevelOrder(BiNode* root){ //层次遍历
BiNode *p;
p=root;
if(p==NULL)return;
queue<BiNode*> a; //利用栈,入队列,如果有左子树,入左子树,如果有右子树,入右子树,然后出队列,输出data
a.push(p);
for(;!a.empty();)
{
p=a.front();
a.pop();
cout<<p->data<<" ";
if(p->lchild!=NULL)
a.push(p->lchild);
if(p->rchild!=NULL)
a.push(p->rchild);
}
}
void FreeBiNode(BiNode *p) //析构二叉树
{
if(p==NULL)
return;
FreeBiNode(p->lchild);
FreeBiNode(p->rchild);
delete p;
}
void BiNodeNumber(BiNode *p,int &n) //计算二叉树结点数量
{
if(p==NULL)
return;
else n++;
BiNodeNumber(p->lchild,n);
BiNodeNumber(p->rchild,n);
}
int BiNodeHigh(BiNode *p) //计算二叉树高度
{
int left,right;
if(p==NULL)
return 0;
left=BiNodeHigh(p->lchild);
right=BiNodeHigh(p->rchild);
if(left>right)
return left+1;
else
return right+1;
}
BiNode* BiNodeSearch(BiNode *p,char n) //指定数据查找节点
{
if(p!=NULL)
{
if(p->data==n)
return p;
}
BiNode *search=NULL;
if(p->lchild!=NULL)
{
search=BiNodeSearch(p->lchild,n);
if(search!=NULL)
return search;
}
if(p->rchild!=NULL)
{
search=BiNodeSearch(p->rchild,n);
if(search!=NULL)
return search;
}
return search;
}
BiNode* searchParent(BiNode* p,BiNode* child)//查找父节点
{
if(p==NULL||child==NULL)
return NULL;
if(p->lchild==child||p->rchild==child)
return p;
BiNode* q=searchParent(p->lchild,child);
if(q!=NULL)
return q;
return searchParent(p->rchild,child);
}
int main(){
BiNode *root;
//先序遍历
/*int r=0,i;
cout<<"你要输入几个数构成二叉树"<<endl;
cin>>i;
char a[2*i+1];
cout<<"创建了"<<i<<"个数据存储个数和"<<i+1<<"个判断空指针个数"<<endl;
cout<<"请输入"<<2*i+1<<"个字符"<<endl;
for(int j=0;j<2*i+1;j++)
{
char t;
cin>>t;
a[j]=t;
}*/
//root=creatBiNode();
//root=creatBiNode(a,r);
//先序+中序遍历;
char a[9]={'A','B','H','F','D','E','C','K','G'},b[10]={'H','B','D','F','A','E','K','C','G'};
root=creatBiNode2(a,b,9);
//计算二叉树结点数量
/*int Number=0;
BiNodeNumber(root,Number);
cout<<"此二叉树结点有:"<<Number<<"个"<<endl;*/
//计算二叉树高度
/*char n[3]={'1','2','3'},m[3]={'2','1','3'};
root=creatBiNode2(n,m,3);*/
/*int High=0;
High=BiNodeHigh(root);
cout<<"此二叉树高为:"<<High<<endl;*/
//按值查找
BiNode* q=BiNodeSearch(root,'B');
cout<<q->data<<endl;
//查找父节点
BiNode* q2=searchParent(root,root->lchild->lchild);
cout<<q2->data<<endl;
PreOrder(root); //先中后层
cout<<endl;
InOrder(root);
cout<<endl;
PostOrder(root);
cout<<endl;
LevelOrder(root);
FreeBiNode(root);
}