二叉树和栈的基本操作

二叉树和栈的基本操作

Tree.h:

#pragma once

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define TreeDataType char

/**二叉树数据结构定义**/
typedef struct BiTreeNode {
	TreeDataType data;
	struct BiTreeNode *left;
	struct BiTreeNode *right;
} BiTreeNode, *BiTree;

/**二叉树的建立--按照先序方式建立--插入**/
void CreateBiTree(BiTree *T);

/**先序遍历  根左右**/
void PreOrderTravel(BiTree T);

/**中序遍历 左根右**/
void InOrderTravel(BiTree T);

/**后序遍历 左右根**/
void TailOrderTravel(BiTree T);

Tree.c:

#include "Tree.h"
#define MAXSIZE 100
/**二叉树的建立--按照先序方式建立--插入**/
void CreateBiTree(BiTree *T) {
	char val;
	scanf("%c", &val);

	if (val == '#')
		*T = NULL; //null表示为空枝

	else {
		*T = (BiTree)malloc(sizeof(BiTreeNode));
		(*T)->data = val;
		CreateBiTree(&(*T)->left);
		CreateBiTree(&(*T)->right);
	}
}


/**先序遍历  根左右**/
void PreOrderTravel(BiTree T) {
	if (T == NULL)
		return;
	printf("%c ", T->data);
	PreOrderTravel(T->left);
	PreOrderTravel(T->right);
}

/**中序遍历 左根右**/
void InOrderTravel(BiTree T) {
	if (T == NULL)
		return;
	InOrderTravel(T->left);
	printf("%c ", T->data);
	InOrderTravel(T->right);
}

/**后序遍历 左右根**/
void TailOrderTravel(BiTree T) {
	if (T == NULL)
		return;
	TailOrderTravel(T->left);
	TailOrderTravel(T->right);
	printf("%c ", T->data);
}

Stack.h:

#pragma once

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

#define MAX_SIZE 100
typedef int StackDataType;
typedef struct Stack {
	StackDataType array[MAX_SIZE];
	int pop;

} Stack;

void StackInit(Stack* pStack); //初始化

void StackDestroy(Stack* pStack); //销毁

void StackPush(Stack* pStack, StackDataType data); //入栈

void StackPop(Stack* pStack); //出栈

StackDataType StackTop(Stack* pStack); //查看栈顶元素

int StackSize(const Stack* pStack); //栈长度

int StackFull(const Stack* pStack); //栈满

int StackEmpty(const Stack* pStack); //栈空

Stack.c:

#include "Stack.h"

void StackInit(Stack* pStack) //初始化
{
	pStack->pop = 0;
}

void StackDestroy(Stack* pStack) //销毁
{
	pStack->pop = 0;
}

void StackPush(Stack* pStack, StackDataType data) //入栈
{
	assert(pStack != NULL);
	pStack->array[pStack->pop] = data;
	pStack->pop++;
}

void StackPop(Stack* pStack) //出栈
{
	assert(pStack != NULL);
	pStack->pop--;
}


StackDataType StackTop(Stack* pStack) //查看在栈顶元素
{
	assert(pStack != NULL);
	return pStack->array[pStack->pop - 1];
}

int StackSize(const Stack* pStack) //栈长度
{
	return pStack->pop;
}

int StackFull(const Stack* pStack) //栈满
{
	if (pStack->pop >= MAX_SIZE) {
		return 1;
	}
	else
	{
		return 0;
	}
}

int StackEmpty(const Stack* pStack) //栈空
{
	if (pStack->pop == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

main.c:

#include <Windows.h>
#include "Stack.h" //栈
#include "Tree.h"  //树

//栈基本操作
void stackvoid() {
	Stack pStack;
	StackInit(&pStack); //初始化
	//StackDestroy(pStack);//销毁
	StackPush(&pStack, 1); //入栈
	StackDataType a = StackTop(&pStack);
	printf("把1入栈,当前栈顶元素:%d\n ", a);

	StackPush(&pStack, 3);
	a = StackTop(&pStack);
	printf("把3入栈,当前栈顶元素:%d \n", a);

	StackPush(&pStack, 5);
	a = StackTop(&pStack);
	printf("把5入栈,当前栈顶元素%d\n", a);

	StackPop(&pStack); //出栈
	a = StackTop(&pStack);
	printf("出栈,当前栈顶元素%d\n ", a);

	int b = StackSize(&pStack);  //栈长度
	int c = StackFull(&pStack);  //栈满
	int d = StackEmpty(&pStack); //栈空
	printf("栈长度:%d\n", b);
	printf("栈满否(1为满,0为未满):%d\n", c);
	printf("栈空否(1为空,0为未空):%d\n", d);
}

void ErChaShu() 
{
	printf("测试代码\n");
	BiTree T;
	T = (BiTree)malloc(sizeof(BiTreeNode));

	printf("请给二叉树按照先序方式依次输入结点的值(空结点为#):\n");
	CreateBiTree(&T);


	printf("先序方式遍历结果:\n");
	PreOrderTravel(T);
	printf("\n");

	printf("中序方式遍历结果:\n");
	InOrderTravel(T);
	printf("\n");

	printf("后序方式遍历结果:\n");
	TailOrderTravel(T);
	printf("\n");
}

int main() {
	//stackvoid();
	ErChaShu();
	system("pause");
	return 0;
}

发布了49 篇原创文章 · 获赞 15 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/wolfGuiDao/article/details/102699130