二叉树的操作

二叉树的一般操作

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值