头文件(c1.h)
#pragma once
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define OVERFLOW -2
typedef char elemtype;
源代码
#include"c1.h"
typedef struct BiNode {
elemtype data;
struct BiNode* lchild, * rchild;
}BINode , *BiTree;
void PreOrderTraverse(BiTree T) { //先序遍历输出
if (T) {
printf("%c", T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T) { //中序遍历输出
if (T) {
InOrderTraverse(T->lchild);
printf("%c", T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T) { //后序遍历输出
if (T) {
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c", T->data);
}
}
void CreateBiTree(BiTree &T) { //先序
char ch;
scanf_s("%c", &ch,sizeof(char));
if (ch == '#') //输入#代表左孩子或有孩子为空
T = NULL;
else {
if (!(T = (BiNode*)malloc(sizeof(BiNode))))
exit(OVERFLOW);
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
int BiTreeDepth(BiTree T) // 求树的深度,depth_left最后得到的是二叉树根节点左子树的高度,depth_right是右子树的高度,取最大值再加上根节点所占的一层就是树的深度。
{
int depth_left;
int depth_right;
if (T == NULL)
return 0;
else {
depth_left = BiTreeDepth(T->lchild);
depth_right = BiTreeDepth(T->rchild);
//return depth_left > depth_right ? depth_left++ : depth_right++;
if (depth_left > depth_right)
return (depth_left + 1);
else
return (depth_right + 1);
}
}
int Node_sum(BiTree T)
{
if (T == NULL)
{
return 0;
}
int lsize = Node_sum(T->lchild);
int rsize = Node_sum(T->rchild);
return 1 + lsize + rsize;
}
int Leaf_sum(BiTree T)
{
if (T == NULL)
return 0;
if ((T->lchild == NULL) && (T->rchild == NULL))
return 1;
return Leaf_sum(T->lchild) + Leaf_sum(T->rchild);
}
void Exchange(BiTree T)
{
if (T->lchild == NULL && T->rchild == NULL) //叶子结点不用交换左右子树
;
else
{
BiTree temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
}
//如果交换后这个节点的左子树不为空,则继续向下交换他的左右子树
if (T->lchild)
Exchange(T->lchild);
//如果交换后这个节点的右子树不为空,则继续向下交换他的左右子树
if (T->rchild)
Exchange(T->rchild);
}
int main()
{
BiTree T;
//(1)创建二叉树
printf("请按照先序输入结点信息\n");
CreateBiTree(T);
//(2)先序,中序,后序输出
PreOrderTraverse(T);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
printf("\n");
//(3)求结点总数和叶子节点数
int Nodesum = Node_sum(T);
int leafsum = Leaf_sum(T);
printf("二叉树结点总数为%d\n", Nodesum);
printf("二叉树叶子结点总数为%d\n", leafsum);
//(4)求树的高度
int depthsum = BiTreeDepth(T);
printf("二叉树的高度为%d\n", depthsum);
//交换左右子树
Exchange(T);
//(2)先序,中序,后序输出
PreOrderTraverse(T);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
printf("\n");
//(3)求结点总数和叶子节点数
Nodesum = Node_sum(T);
leafsum = Leaf_sum(T);
printf("二叉树结点总数为%d\n", Nodesum);
printf("二叉树叶子结点总数为%d\n", leafsum);
//(4)求树的高度
depthsum = BiTreeDepth(T);
printf("二叉树的高度为%d\n", depthsum);
return 0;
}