0. 遍历:
前序遍历代码如下:
if(T!=NULL) //if(T)
{
printf("%c ",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
#include "stdafx.h"
#include "malloc.h"
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
int CreateBiTree(BiTree &T)
{
char ch;
scanf("%c",&ch);//abc de g f
if(ch==' ')
T=NULL;
else
{
T=(BiTNode*)malloc(sizeof(BiTNode));
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return 1;
}
void PreOrder(BiTree T)//0.前序遍历
{
if(T!=NULL) //if(T)
{
printf("%c ",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
int main()
{
BiTree T;
CreateBiTree(T);
PreOrder(T);
return 0;
}
/*输入:加空格的 如abc de g f
是五层
*/
输入:abc□□de□g□□f□□□, 其中□代表空格,生成如下图所示二叉树,则运行结果如图所示。
==abc de g f ==
1. 结点总数
2. 叶子结点总数
if(T->lchildNULL && T->rchildNULL)//叶子结点数
{
printf("%c ",T->data);
num2++;
}
3. 分支结点的总数
if(T->lchild!=NULL || T->rchild!=NULL)//叶子结点数
{
printf("%c ",T->data);
num3++;
}
4. 度为2的结点的个数
if(T->lchild!=NULL && T->rchild!=NULL)//叶子结点数
{
printf("%c ",T->data);
num4++;
}
5. 遍历树时显示每个结点的层号
队列法rear
6. 树的深度
在函数定义多加一个参数 level,自定义level的初始值;
void Width(BiTree T,int level)//6.前序遍历求深度(层数)
{
if(T!=NULL)
{
if(level>max)
max=level;
Width(T->lchild,level+1);
Width(T->rchild,level+1);
}
}
int main(){
…
Width(T,1);
…
}
7. 遍历时只输出树的第i层结点
void LevelNodeNum(BiTree T, ==int level==)
{
if(T!=NULL)
{
==if(level==i)
{
num7++;
printf("%c ",T->data);
}
LevelNodeNum(T->lchild, level+1);
LevelNodeNum(T->rchild, level+1);==
}
}
8. 完整代码
#include "stdafx.h"
#include "malloc.h"
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
int CreateBiTree(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch==' ')
T=NULL;
else
{
T=(BiTNode*)malloc(sizeof(BiTNode));
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return 1;
}
void PreOrder(BiTree T)//0.前序遍历
{
if(T!=NULL) //if(T)
{
printf("%c ",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
int num1=0;
void NodeNum(BiTree T)//1.结点数
{
if(T!=NULL) //if(T)
{
/*------------------------------------------------------------*/
num1++;
/*------------------------------------------------------------*/
NodeNum(T->lchild);
NodeNum(T->rchild);
}
}
int num2=0;
void LeafNum(BiTree T)//2.前序遍历求叶子结点数
{
if(T!=NULL)
{
/*------------------------------------------------------------*/
if(T->lchild==NULL && T->rchild==NULL)//叶子结点数
{
printf("%c ",T->data);
num2++;
}
/*------------------------------------------------------------*/
LeafNum(T->lchild);
LeafNum(T->rchild);
}
}
int num3=0;
void FenzhiNum(BiTree T)//3.前序遍历求分支结点数
{
if(T!=NULL)
{
/*------------------------------------------------------------*/
if(T->lchild!=NULL || T->rchild!=NULL)//这里是" 或 "
{
printf("%c ",T->data);
num3++;
}
/*------------------------------------------------------------*/
FenzhiNum(T->lchild);
FenzhiNum(T->rchild);
}
}
int num4=0;
void TwoChildNum(BiTree T)//4.前序遍历求度为2结点数
{
if(T!=NULL)
{
/*------------------------------------------------------------*/
if(T->lchild!=NULL && T->rchild!=NULL)//这里是" 且 "
{
printf("%c ",T->data);
num4++;
}
/*------------------------------------------------------------*/
TwoChildNum(T->lchild);
TwoChildNum(T->rchild);
}
}
void LevelOrder(BiTree T)//5.遍历树时显示每个结点的层号---Teacher Tong
{
BiTree a,Q[1000];
int front,rear,level=0;
if(T==NULL)
return;
Q[0]=NULL;
Q[1]=T;
front=0;
rear=2;
while(front!=rear)
{
a=Q[front];
front=(front+1)%1000;
if(a==NULL)
{
if(front==rear)
return;
Q[rear]=NULL;
rear=(rear+1)%1000;
level++;
printf("\n第%d层: ",level);
}
else
{
printf("%c ",a->data);
/*------------------------------------------------------------*/
if(a->lchild!=NULL)
{
Q[rear]=a->lchild;
rear=(rear+1)%1000;
}
if(a->rchild!=NULL)
{
Q[rear]=a->rchild;
rear=(rear+1)%1000;
}
/*------------------------------------------------------------*/
}
}
}
int max=0;
void Width(BiTree T,int level)//6.前序遍历求深度(层数)
{
if(T!=NULL)
{
/*------------------------------------------------------------*/
if(level>max)
max=level;
/*------------------------------------------------------------*/
Width(T->lchild,level+1);
Width(T->rchild,level+1);
}
}
//7.求二叉树T的第i层包含的结点的个数
int num7;
int i;
void LevelNodeNum(BiTree T, int level)
{
if(T!=NULL)
{
/*------------------------------------------------------------*/
if(level==i)
{
num7++;
printf("%c ",T->data);
}
/*------------------------------------------------------------*/
LevelNodeNum(T->lchild, level+1);
LevelNodeNum(T->rchild, level+1);
}
}
int main()
{
BiTree T;
CreateBiTree(T);
printf("0.树结点为: ");
PreOrder(T);
printf("\n");
NodeNum(T);
printf("1.结点数为%d\n",num1);
printf("\n");
printf("2.叶子结点为: ");
LeafNum(T);
printf("\t叶子结点数为%d\n",num2);
printf("\n");
printf("3.分支结点为: ");
FenzhiNum(T);
printf("\t分支结点数为%d\n",num3);
printf("\n");
printf("4.度为2结点为: ");
TwoChildNum(T);
printf("\t度为2结点数为%d\n",num4);
printf("\n");
printf("5.每层结点\n");
LevelOrder(T);
printf("\n");
Width(T,1);//初始化从1开始,若从0开始就改为0
printf("6.层数/深度是%d\n",max);
printf("\n");
scanf("%d",&i);
printf("第%d层结点为 :",i);
LevelNodeNum(T,1);
printf("\n结点数为%d\n",num7);
return 0;
}
/*输入:加空格的 如abc de g f
是五层
*