二叉树的实验操作:
题目如下:
1.设某二叉树的结点类型为整数类型,以二叉链表形式作为存储结构。试编程实现:
(1) 生成一棵二叉树.
(2) 用递归算法、非递归算法实现二叉树的遍历;
(3) 求度分别为0、1、2的结点的数目,分别用递归算法、非递归算法实现;
(4) 按层次遍历二叉树(提示:使用一个队列实现);
*(5) 求二叉树的高度(深度);
*(6) 判断是否为完全二叉树,输出'Yes!'/'No!';
*(7) 交换每个结点的左右子树;
*(8) 对交换左右子树后的二叉树作中序遍历。
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#define ERROR 0
#define OK 1
#define OVERFLOW -2
#define queuesize 20
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
typedef struct Queue{
int front ,rear ;
BiTree data[queuesize]; //循环队列元素类型为二叉链表结点指针
int count;
}Queue; //循环队列结构定义
int CreateBiTree(BiTree * T) { //声明的就是一个BiTree类型的指针,通过修改来对main中的T做修改,然后使其指向根结点
// 按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,
// 构造二叉链表表示的二叉树T。
int ch;
printf("请输入一个根结点的值(如果为空,则输入0)\n");
scanf("%d",&ch);
if (ch==0) (*T)= NULL;
else {
if (!(*T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
(*T)->data = ch; // 生成根结点
CreateBiTree(&(*T)->lchild); // 构造左子树
CreateBiTree(&(*T)->rchild); // 构造右子树
}
return OK;
} // CreateBiTree
int PreOrderTraverse(BiTree T) //用递归算法写的遍历函数,按照先序遍历,同时输出结点的值
{
if(T!=NULL)
{
printf("%d ",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
return OK;
}
int InorderTraverse(BiTree T)
{
if(T!=NULL)
{
InorderTraverse(T->lchild);
printf("%d ",T->data);
InorderTraverse(T->rchild);
}
return OK;
}
int PreOrderTraverse2(BiTree T) //用非递归的算法写的遍历函数,按照先序遍历,同时输出结点的值
{
BiTree p,s[20];
int top=0;
p=T;
while((p!=NULL)||(top>0))
{
while(p!=NULL)
{
printf("%d ",p->data);
s[++top]=p;
p=p->lchild;
}
p=s[top--];
p=p->rchild;
}
return OK;
}
int get_all_node(BiTree T) //求出总的结点的个数
{
BiTree p,s[20];
int num_node=0;
int top=0;
p=T;
while((p!=NULL)||(top>0))
{
while(p!=NULL)
{
num_node++;
s[++top]=p;
p=p->lchild;
}
p=s[top--];
p=p->rchild;
}
return num_node;
}
int get_node0_1(BiTree T)//利用递归算法得到度为0的结点的个数
{
int num1,num2;