数据结构之二叉树基本功能的实现

二叉树的各种性质在这里不再重复,本文实现二叉树的基本操作,包括创建、前序输出、中序输出、后序输出、删除二叉树、叶子结点个数、叶子节点的值、交换左右子树
1.首先创建结构体:

typedef struct Tree_Node{
	char ch;
	struct Tree_Node *left;
	struct Tree_Node *right;
}tree;

2.先序创建树

tree *create(){
	tree *t;
	char ch;
	scanf("%c",&ch);
	if(ch =='*')
	t = NULL;
	else{
		t = (tree*)malloc(sizeof(tree));
		if(!t)
		return NULL;
		t->ch = ch;
		t->left = create(t->left);
		t->right = create(t->right);
	}
	return t;
}

3.三种打印树的方式
前序输出:

void PreShow(tree *tree){
	if(!tree)
	return;
	printf("%c ",tree->ch);
	PreShow(tree->left);
	PreShow(tree->right);
}

中序输出

void MidShow(tree *tree){
	if(!tree)
	return;
	MidShow(tree->left);
	printf("%c ",tree->ch);
	MidShow(tree->right);
} 

后序输出

void EndShow(tree *tree){
	if(!tree)
	return;
	EndShow(tree->left);
	EndShow(tree->right);
	printf("%c ",tree->ch);
}

4.得到树的高度

int getHeight(tree *tree){
	if(!tree)
		return 0; 
	return getHeight(tree->left)>getHeight(tree->right)?getHeight(tree->left) + 1:getHeight(tree->right)+1;
} 

6.得到树的节点总数
sum = left + right + 1

int getSum(tree *tree){
	if(!tree)
	return 0;
	return getSum(tree->left) + getSum(tree->right) + 1;
}

5.叶子结点的总数

int getleaf(tree *tree){
	if(!tree)
	return ;
	if(tree->left == NULL && tree->right == NULL)
	return 1;
	return getleaf(tree->left) + getleaf(tree->right);
}

6.打印叶子结点

void printleaf(tree *tree){
	if(!tree)
	return ;
	if(tree->left == NULL && tree->right == NULL)
	printf("%c ",tree->ch);
	printleaf(tree->left);
	printleaf(tree->right);
}

7.左右子树交换

void reverse(tree *tree){
	if(!tree)
	return;
	tree *t = tree->left;
	tree->left = tree->right;
	tree->right = t;
	if(tree->left)
	reverse(tree->left);
	if(tree->right)
	reverse(tree->right);
}

8.删除二叉树

void clear(tree *tree){
	if(tree == NULL)
	return;
	clear(tree->left);
	clear(tree->right);
	free(tree);
	tree = NULL;
}

最后附上完整代码

#include <stdio.h>
#include <stdlib.h>

typedef struct Tree_Node{
	char ch;
	struct Tree_Node *left;
	struct Tree_Node *right;
}tree;


tree *create(){
	tree *t;
	char ch;
	scanf("%c",&ch);
	if(ch =='*')
	t = NULL;
	else{
		t = (tree*)malloc(sizeof(tree));
		if(!t)
		return NULL;
		t->ch = ch;
		t->left = create(t->left);
		t->right = create(t->right);
	}
	return t;
}


void PreShow(tree *tree){
	if(!tree)
	return;
	printf("%c ",tree->ch);
	PreShow(tree->left);
	PreShow(tree->right);
}

void MidShow(tree *tree){
	if(!tree)
	return;
	MidShow(tree->left);
	printf("%c ",tree->ch);
	MidShow(tree->right);
} 

void EndShow(tree *tree){
	if(!tree)
	return;
	EndShow(tree->left);
	EndShow(tree->right);
	printf("%c ",tree->ch);
}

int getHeight(tree *tree){
	if(!tree)
		return 0; 
	return getHeight(tree->left)>getHeight(tree->right)?getHeight(tree->left) + 1:getHeight(tree->right)+1;
} 

int getSum(tree *tree){
	if(!tree)
	return 0;
	return getSum(tree->left) + getSum(tree->right) + 1;
}

void clear(tree *tree){
	if(tree == NULL)
	return;
	clear(tree->left);
	clear(tree->right);
	free(tree);
	tree = NULL;
}


void reverse(tree *tree){
	if(!tree)
	return;
	tree *t = tree->left;
	tree->left = tree->right;
	tree->right = t;
	if(tree->left)
	reverse(tree->left);
	if(tree->right)
	reverse(tree->right);
}
int getleaf(tree *tree){
	if(!tree)
	return ;
	if(tree->left == NULL && tree->right == NULL)
	return 1;
	return getleaf(tree->left) + getleaf(tree->right);
}

void printleaf(tree *tree){
	if(!tree)
	return ;
	if(tree->left == NULL && tree->right == NULL)
	printf("%c ",tree->ch);
	printleaf(tree->left);
	printleaf(tree->right);
}


int main(){
	tree *t;
	t = NULL;
	//temp = NULL;
	t = create();
	printf("前序遍历:");
	PreShow(t);
	printf("\n后序遍历:");
	EndShow(t);
	printf("\n中序遍历:");
	MidShow(t); 
	getHeight(t);
	printf("\n高度为:%d",getHeight(t));
	printf("\n节点总数为:%d\n",getSum(t));

	printf("叶子节点数为:%d",getleaf(t));
	printf("\n叶子节点为:");
	printleaf(t);
//	reverse(t);
//	PreShow(t);
	clear(t);
}

猜你喜欢

转载自blog.csdn.net/qq_43060759/article/details/83046305