数据结构实验题,二叉树的先序,后序,中序,层次遍历,插入结点,求叶子结点个数,求非叶子结点个数,求总结点数,求树的深度,已知先序和中序重构二叉树。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int ctrl_i=0;
typedef struct BTNode{
char data; //结点的信息用一个字符保存
BTNode*lchild, *rchild; //左右孩子的指针
}BTNode;
#define MAX_SIZE 128
#define STR_SIZE 1024
typedef struct Node { // 定义二叉链
char data; // 数据元素
struct Node* lchild; // 指向左孩子节点
struct Node* rchild; // 指向右孩子节点
} LinkNode; // struct Node 的别名
typedef struct Quene { // 定义顺序队
int front; // 队头指针
int rear; // 队尾指针
BTNode* data[MAX_SIZE]; // 存放队中元素
} SqQueue; // struct Queue 的别名
//生成唯一的根节点。根节点的信息用一个字符参数输入。
BTNode *CreateRoot(char c)
{
//申请根结点空间
BTNode * tmp = (BTNode *)malloc(sizeof(BTNode));
//判断申请空间是否成功,若成功,则输入结点信息,并初始化指针
if (!tmp)
printf("申请空间失败,无法创建根结点\n");
else
{//申请空间成功,为根节点赋初值
tmp->data = c;
tmp->lchild = NULL;
tmp->rchild = NULL;
}
//返回根节点
return tmp ;
}
//在指定结点下插入一个左孩子,原先的左子树作为新插入左孩子结点的左子树,并返回新插入左孩子结点的指针。
BTNode *InsertLeftNode(BTNode *curNode, char c)
{
//申请左孩子结点的空间
BTNode * tmp = (BTNode *)malloc(sizeof(BTNode) );
//判断申请空间是否成功,若成功,则输入结点信息,并初始化指针
if (tmp==NULL)
printf("申请空间失败,无法创建根结点\n");
else
{
//curNode原先的左子树挂到新结点下面
tmp->lchild = curNode->lchild;
//新结点右子树置空
tmp->rchild = NULL;
//输入新结点信息
tmp->data = c;
//新结点作为左孩子挂在curNode下面
curNode->lchild=tmp;
}
return tmp ;
}
//删除左子结点
//若指定结点的左子结点仅有一颗子树,则删除该左子结点,同时将其子树作为指定结点的左子树。
void DelLeftNode(BTNode *curNode)
{
//如果curNode的左子结点有两颗子树,则不删除,直接返回。
if ( curNode->lchild->lchild && curNode->lchild->rchild ) return;
//暂存左子结点指针
BTNode * tmp = curNode->lchild ;
//保存该左子结点的非空子树
BTNode *lc = tmp->lchild?tmp->lchild: tmp->rchild ;
//该非空子树挂到curNode的左路
curNode->lchild = lc;
//删除左子结点
free(tmp);
}
//在指定结点下插入一个右孩子,原先的右子树作为新插入右孩子结点的右子树,并返回新插入右孩子结点的指针。
BTNode *InsertRightNode(BTNode *curNode, char c)
{
//申请右孩子结点的空间
BTNode * tmp = (BTNode *)malloc(sizeof(BTNode) );
//判断申请空间是否成功,若成功,则输入结点信息,并初始化指针
if (tmp==NULL)
printf("申请空间失败&#x