二叉樹

#include <iostream>
#include <stack>node

using namespace std;ios

typedef struct bitreenode
{
  char data;
  struct bitreenode *lchild,*rchild;
}*Bitree;函數

//建立二叉樹
void createbitree(Bitree &T)
{
  char data;
  data=getchar();
if(data=='#')
{
  T=NULL;
}
else
{
  T=new bitreenode;
  T->data=data;
  createbitree(T->lchild);
  createbitree(T->rchild);
}
};post

//遞歸的先序遍歷二叉樹
void preordertraverse(Bitree T)
{
if(T)
{
  cout<<T->data<<" ";//輸出根結點
  preordertraverse(T->lchild);
  preordertraverse(T->rchild);
}
}spa

//遞歸的中序遍歷二叉樹
void inordertraverse(Bitree T)
{
if(T)
{
  inordertraverse(T->lchild);
  cout<<T->data<<" ";//輸出根結點
  inordertraverse(T->rchild);
}
}遞歸

//遞歸的後序遍歷二叉樹
void postordertraverse(Bitree T)
{
if(T)
{
  postordertraverse(T->lchild);
  postordertraverse(T->rchild);
  cout<<T->data<<" ";//輸出根結點
}
}get

//求二叉樹的深度
int depthofbitree(Bitree T)
{
  int ldepth;
  int rdepth;
if(T==NULL) //空樹
{
return 0;
}it

ldepth=depthofbitree(T->lchild);
rdepth=depthofbitree(T->rchild);io

if(ldepth>rdepth)
return ldepth+1;
else
return rdepth+1;
}stream

//求二叉樹的葉子結點
int leafcount(Bitree T)
{
if(T==NULL)
{
  return 0;
}
else if(T->lchild==NULL && T->rchild==NULL)
{
  return 1;
}
else
{
  int n=leafcount(T->lchild);//求左子樹葉子的數目
  int m=leafcount(T->rchild);//求右子樹葉子的數目
  return n+m;
  }
}

//求二叉樹T中度爲1的結點的數量
int onesoncount(Bitree T)
{
if(T==NULL)
{
  return 0;
}
else if((T->lchild==NULL && T->rchild!=NULL) ||(T->lchild!=NULL && T->rchild==NULL))
{
  cout<<"度爲1的結點的字母爲:"<<T->data<<endl;
  return (onesoncount(T->lchild) +onesoncount(T->rchild) +1);
  }
else
{
return (onesoncount(T->lchild) +onesoncount(T->rchild));
}
}

//求非葉子結點的數目
int notleafcount(Bitree T)
{
if(T==NULL)
{
  return 0;
}
else if(T->lchild == NULL && T->rchild == NULL)
return 0;
else
{
  cout<<T->data; //輸出非終端結點的值
  int n=notleafcount(T->lchild); //左子樹非終端結點的數目
  int m=notleafcount(T->rchild); //右子樹非終端結點的數目
    return (m+n+1);
  }
}

//求二叉樹的所有結點數目
int node_num(Bitree T)
{
  if(T==NULL)
  return 0;
  else
  return node_num(T->lchild)+node_num(T->rchild)+1;
}

///////////////主函數///////////////
void main()
{
  Bitree t=NULL;
  printf("請按如下兩種序列輸入二叉樹的結點:\n");
  printf("AB#D##CE### 或 ABD##E##C#F##\n");
  createbitree(t);
  cout<<"先序遍歷:";
  preordertraverse(t);
  cout<<endl;

  cout<<"中序遍歷:";
  inordertraverse(t);
  cout<<endl;

  cout<<"後序遍歷:";
  postordertraverse(t);
  cout<<endl;

  cout<<"二叉樹的深度爲:"<<depthofbitree(t)<<endl;

  int leaf=0; //葉子結點數目,初始化爲0
  leaf=leafcount(t);
  cout<<"葉子結點數爲:"<<leaf<<endl;

  int oneson=0; //度爲1的結點數目
  oneson=onesoncount(t);
  cout<<"度爲1的結點的數量爲:"<<oneson<<endl;

  int notleafcount_=0; //非葉子結點的數目,初始化爲0
  cout<<"非葉子結點爲:";/////////////
  notleafcount_=notleafcount(t);//////////////????????
  cout<<endl;
  cout<<"非葉子結點的數量爲:"<<notleafcount_<<endl;

  int node_number=0; //初始化所有結點的數目爲0
  node_number=node_num(t);
  cout<<"二叉樹所有結點的數量爲:"<<node_number<<endl;

}

相關文章
相關標籤/搜索