/*
二叉树的创建、遍历、删除、清空、节点个数、高度的实现
author: mmciel
time:2019-4-2 11:08:48
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef char ElemType;
typedef struct BiNode
{
ElemType data;
BiNode * left;
BiNode * right;
}BiNode,*BiTree;
//创建二叉树
void InitBiTree(BiTree * T);
//初始化二叉树(利用先序创建)
BiTree CreateBiTree();
void PreOrder(BiTree T);
// 中序遍历
void InOrder(BiTree T);
// 后序遍历
void PostOrder(BiTree T);
// 二叉树打印
void PrintTree(BiTree T);
// 判断是否为空
int isEmpty(BiTree T);
// 销毁
void DestroyBiTree(BiTree * T);
// 清空二叉树
void ClearBiTree(BiTree * T);
// 求叶子节点个数
int BiYeNode(BiTree T);
// 求树的高度
int BiHight(BiTree T);
int main()
{
printf("请输入节点:\n");
//初始化并赋值
BiTree t ;
InitBiTree(&t);
//CreateBiTree(&t);
t = CreateBiTree();
// 输出二叉树
PrintTree(t);
printf("树的高度为:%d\n", BiHight(t));
printf("树的叶子节点个数为:%d\n",BiYeNode(t));
ClearBiTree(&t);
if(isEmpty(t)){
printf("二叉树已清空\n");
}
else{
printf("二叉树未清空\n");
}
DestroyBiTree(&t);
if (t == NULL)
{
printf("销毁成功\n");
}
return 0;
}
//创建二叉树
void InitBiTree(BiTree * T){
(*T) = (BiTree )malloc(sizeof(BiNode));
(*T)->left = NULL;
(*T)->right= NULL;
}
//初始化二叉树(利用先序创建)
BiTree CreateBiTree()
{
char ch;
ch=getchar();
if(ch=='#')
return NULL;
BiTree temp=(BiTree)malloc(sizeof(BiNode));
temp->data=ch;
temp->left=CreateBiTree();
temp->right=CreateBiTree();
return temp;
}
//先序遍历
void PreOrder(BiTree T){
if(T == NULL) return;
printf("%c ", T->data);
PreOrder(T->left);
PreOrder(T->right);
}
// 中序遍历
void InOrder(BiTree T){
if(T == NULL) return;
InOrder(T->left);
printf("%c ", T->data);
InOrder(T->right);
}
// 后序遍历
void PostOrder(BiTree T){
if(T == NULL) return;
PostOrder(T->left);
PostOrder(T->right);
printf("%c ", T->data);
}
void PrintTree(BiTree T){
printf("前序遍历\n");
PreOrder(T);
printf("\n");
printf("中序遍历\n");
InOrder(T);
printf("\n");
printf("后序遍历\n");
PostOrder(T);
printf("\n");
}
// 判断是否为空
int isEmpty(BiTree T){
if(T == NULL){
return 1;
}
else{
return 0;
}
}
// 销毁
void DestroyBiTree(BiTree * T){
if(*T != NULL){
if((*T)->left != NULL){
DestroyBiTree(&(*T)->left);
}
if((*T)->right != NULL){
DestroyBiTree(&(*T)->right);
}
free(*T);
*T = NULL;
return ;
}
}
// 清空二叉树
void ClearBiTree(BiTree * T){
if(T == NULL){
return;
}
if((*T)->left)ClearBiTree(&(*T)->left);
if((*T)->right)ClearBiTree(&(*T)->right);
free(*T);
*T = NULL;
return;
}
int BiYeNode(BiTree T){
if(T == NULL){
return 0;
}
if(T->left == NULL && T->right == NULL){
return 1;
}
return BiYeNode(T->left)+BiYeNode(T->right);
}
int BiHight(BiTree T){
if(T == NULL) return 0;
return 1+(BiHight(T->left)>BiHight(T->right) ? BiHight(T->left) : BiHight(T->right));
}
【辉哥带我学数据结构】二叉树(一)二叉树的基本操作(建立、遍历、删除、清空、叶子节点个数、高度)
最新推荐文章于 2023-01-01 18:08:30 发布