【辉哥带我学数据结构】二叉树(一)二叉树的基本操作(建立、遍历、删除、清空、叶子节点个数、高度)


/*
	二叉树的创建、遍历、删除、清空、节点个数、高度的实现
	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));
}

猜你喜欢

转载自blog.csdn.net/F_zmmfs/article/details/89010650