完成二叉树的定义与遍历操作。
要求:
- 创建二叉树(10分)
- 对二叉树进行中序遍历(10分)
- 对二叉树进行前序遍历(10分)
- 对二叉树进行后序遍历(10分)
- 求二叉树的高度(15分)
- 求二叉树中总结点个数(15分)
- 复制二叉树(15分)
- 编写main函数,调用以上函数进行调试输出(15分)
#include<stdio.h>
#include<stdlib.h>
int Treelayer = 1;
// 输入-1表示该节点为空
typedef struct Tree{
int data; // 存放数据域
struct Tree *left; // 遍历左子树指针
struct Tree *right; // 遍历右子树指针
}Tree,*BitTree;
//创建二叉树
BitTree CreateTree()
{
int data;
BitTree T;
scanf("%d",&data);
if(data == -1){ // 输入-1 代表此节点下子树不存数据,也就是不继续递归创建
return NULL;
}else{
//开始创建树的结构
T = (BitTree)malloc(sizeof(Tree));
T->data = data;
printf("创建%d的左子树:",data);
T->left = CreateTree();
printf("创建%d的右子树:",data);
T->right = CreateTree();
return T; // 返回根节点
}
}
// 先序遍历
void Preorder(BitTree T)
{
if(T==NULL) // 递归中遇到NULL,返回上一层节点
{
return;
}
printf("%d ",T->data);
Preorder(T->left);
Preorder(T->right);
}
// 中序遍历
void Inorder(BitTree T)
{
if(T==NULL) // 递归中遇到NULL,返回上一层节点
{
return;
}
Inorder(T->left);
printf("%d ",T->data);
Inorder(T->right);
}
// 后序遍历
void Postorder(BitTree T)
{
if(T==NULL) // 递归中遇到NULL,返回上一层节点
{
return;
}
Postorder(T->left);
Postorder(T->right);
printf("%d ",T->data);
}
// 计算树的高度
int Treeheight(BitTree T)
{
if(T==NULL)
return 0;
else{
//计算左子树和右子树的高度
int Lheight = Treeheight(T->left);
int Rheight = Treeheight(T->right);
if(Lheight > Rheight)
return(Lheight+1);
else return(Rheight+1);
}
}
// 求二叉树的总结点数
int Treenode(BitTree T)
{
if(T==NULL)
return 0;
else{
//计算左右子树的节点
int Lnode = Treenode(T->left);
int Rnode = Treenode(T->right);
return Lnode+Rnode+1;
}
}
//复制二叉树
BitTree Copytree(BitTree T)
{
BitTree newTree;
if(T == NULL)
{
return NULL;
}else
{
//创建复制的二叉树
newTree = (BitTree)malloc(sizeof(Tree));
newTree->data = T->data;
newTree->left = Copytree(T->left);
newTree->right = Copytree(T->right);
return newTree;
}
}
int main()
{
BitTree S;
printf("请输入数的根节点数据:\n");
S = CreateTree(); //接受创建二叉树完成的根节点
printf("先序遍历结果: \n");
Preorder(S);
printf("\n中序遍历结果: \n");
Inorder(S);
printf("\n后序遍历结果: \n");
Postorder(S);
//输出树的层数
printf("\n树的层数:%d\n",Treeheight(S));
//输出树的节点个数
printf("树的节点数:%d\n",Treenode(S));
//输出复制的树
BitTree Copy = NULL;
printf("复制的二叉树中序遍历结果\n");
Copy = Copytree(S);
Inorder(Copy);
return 0;
}