二叉树是笔试面试中考试最频繁的数据结构之一,主要包括,程序建立一个二叉树,三种次序遍历二叉树,返回叶子节点的数目,求二叉树节点的总数等。建立一个二叉树节点的数据结构
typedef struct Node
{
int data;
struct Node *left,*right;
}Node;,结构体内包括数据,左子树,又子树;
一、建立二叉树的程序代码如下
[cpp] Node *CreatBTree() //建立二叉树
{
Node *t;
int x;
scanf("%d",&x);
if(x==0)
{
t=NULL;
}
else
{
t=(Node*)malloc(sizeof(Node));
t->data=x;
printf("\n请输入%d结点的左子结点:",t->data );
t->left=CreatBTree();
printf("\n请输入%d结点的右子结点:",t->data );
t->right=CreatBTree();
}
return t;
}
Node *CreatBTree() //建立二叉树
{
Node *t;
int x;
scanf("%d",&x);
if(x==0)
{
t=NULL;
}
else
{
t=(Node*)malloc(sizeof(Node));
t->data=x;
printf("\n请输入%d结点的左子结点:",t->data );
t->left=CreatBTree();
printf("\n请输入%d结点的右子结点:",t->data );
t->right=CreatBTree();
}
return t;
}
二、前序遍历二叉树
[cpp] void preVisit(Node *T)
{
if(T==NULL) return;
else
{
printf("%3d",T->data);
preVisit(T->left);
preVisit(T->right);
}
}
void preVisit(Node *T)
{
if(T==NULL) return;
else
{
printf("%3d",T->data);
preVisit(T->left);
preVisit(T->right);
}
}
三、中序遍历二叉树
[cpp] void middVisit(Node *T)
{
if(T==NULL) return;
else
{
middVisit(T->left);
printf("%3d",T->data);
middVisit(T->right);
}
}
void middVisit(Node *T)
{
if(T==NULL) return;
else
{
middVisit(T->left);
printf("%3d",T->data);
middVisit(T->right);
}
}
四、后序遍历二叉树
[cpp] void lastVisit(Node *T)
{
if(T==NULL) return;
else
{
lastVisit(T->left);
lastVisit(T->right);
printf("%3d",T->data);
}
}
void lastVisit(Node *T)
{
if(T==NULL) return;
else
{
lastVisit(T->left);
lastVisit(T->right);
printf("%3d",T->data);
}
}
五、返回叶子节点数目
[cpp] int leafnum(Node *T)
{
if (!T)
{
return 0;
}
else if ((!T->left)&&(!T->right))
{
return 1;
}
else
{
return ((leafnum(T->left)+leafnum(T->right)));
}
}
int leafnum(Node *T)
{
if (!T)
{
return 0;
}
else if ((!T->left)&&(!T->right))
{
return 1;
}
else
{
return ((leafnum(T->left)+leafnum(T->right)));
}
}
六、返回节点总数目
[cpp] view plaincopyprint?int Nodenum(Node *T)
{
if (T)
{
return 1+Nodenum(T->left)+Nodenum(T->right);
}
if (T==NULL)
{
return 0;
}
}
int Nodenum(Node *T)
{
if (T)
{
return 1+Nodenum(T->left)+Nodenum(T->right);
}
if (T==NULL)
{
return 0;
}
}
七、测试程序;[cpp] int menu();
void main()
{
Node *T=NULL;
int choice;
do{
choice=menu();
if(choice==1)
{
printf("二叉树的建立,以输入“0”表示结束:!\n");
printf("请输入根结点:\n");
T=CreatBTree();
printf("二叉树成功建立");
}
else if(choice==2)
{
printf("先序遍历二叉树 :\n");
preVisit(T);
}
else if(choice==3)
{
printf("中序遍历二叉树:\n");
middVisit(T);
}
else if(choice==4)
{
printf("后序遍历二叉树 :\n ");
lastVisit(T);
}
else if(choice==5)
{
int ct=10;
ct=leafnum(T);
printf(" 二叉树的叶子结点数为 : \n");
printf("%d\n",ct);
}
else if(choice==7)
{
int count=Nodenum(T);
printf("该二叉树总共有%d个结点。\n",count);
}
else if(choice==8)
exit(0);
}while(choice<=8);
}
int menu();
void main()
{
Node *T=NULL;
int choice;
do{
choice=menu();
if(choice==1)
{
printf("二叉树的建立,以输入“0”表示结束:!\n");
printf("请输入根结点:\n");
T=CreatBTree();
printf("二叉树成功建立");
}
else if(choice==2)
{
printf("先序遍历二叉树 :\n");
preVisit(T);
}
else if(choice==3)
{
printf("中序遍历二叉树:\n");
middVisit(T);
}
else if(choice==4)
{
printf("后序遍历二叉树 :\n ");
lastVisit(T);
}
else if(choice==5)
{
int ct=10;
ct=leafnum(T);
printf(" 二叉树的叶子结点数为 : \n");
printf("%d\n",ct);
}
else if(choice==7)
{
int count=Nodenum(T);
printf("该二叉树总共有%d个结点。\n",count);
}
else if(choice==8)
exit(0);
}while(choice<=8);
}
[cpp] int menu()
{
int choice;
printf("\n");
printf(" 二叉树 \n");
printf(" ***************************\n");
printf(" * *\n");
printf(" * 主菜单 *\n");
printf(" * 1 建立二叉树 *\n");
printf(" * 2 先序遍历二叉树 *\n");
printf(" * 3 中序遍历二叉树 *\n");
printf(" * 4 后序遍历二叉树 *\n");
printf(" * 5 二叉树的叶子结点数 *\n");
printf(" * 7 二叉树的所有结点数 *\n");
printf(" * 8 退出程序运行 *\n");
printf(" ****************************\n");
printf(" 请输入您的选择(1,2,3,4,5,6,7,8): \n");
scanf("%d",&choice);
return choice;
}
int menu()
{
int choice;
printf("\n");
printf(" 二叉树 \n");
printf(" ***************************\n");
printf(" * *\n");
printf(" * 主菜单 *\n");
printf(" * 1 建立二叉树 *\n");
printf(" * 2 先序遍历二叉树 *\n");
printf(" * 3 中序遍历二叉树 *\n");
printf(" * 4 后序遍历二叉树 *\n");
printf(" * 5 二叉树的叶子结点数 *\n");
printf(" * 7 二叉树的所有结点数 *\n");
printf(" * 8 退出程序运行 *\n");
printf(" ****************************\n");
printf(" 请输入您的选择(1,2,3,4,5,6,7,8): \n");
scanf("%d",&choice);
return choice;
}