通用的算法实现,不多说,直接上代码;
需要注意的是在创建的时候传入的是根地址,在C++中可以用引用;
binary_tree.h
#ifndef _BINARY_TREE_H
#define _BINARY_TREE_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STACK_ERR (-1);
#define STACK_SUCCESS 0
#define BIN_TREE_ERR (-1)
#define BIN_TREE_SUCCESS 0
typedef struct binary_node{
char nodeValue;
struct binary_node *leftChild;
struct binary_node *rightChild;
}*PBinTree, BinTree;
/* 递归创建一个二叉树 */
void CreateBinTree(PBinTree *tree);
/* 二叉树先序遍历 */
void PreTraverTree(PBinTree tree);
/* 二叉树后序遍历 */
void PostTraverTree(PBinTree tree);
/* 二叉树中序遍历 */
void InTraverTree(PBinTree tree);
#endif
binary_tree.c
#include "binary_tree.h"
PStack CreateStack()
{
PStack stack = (PStack)malloc(sizeof(Stack));
if(stack == NULL) {
perror("stack malloc error.");
return (PStack)STACK_ERR;
}
stack->size = 0;
stack->top = NULL;
return stack;
}
int StackIsEmpty(const PStack stack)
{
if(stack == NULL) {
perror("stack is null.");
return STACK_ERR;
}
return (stack->top == NULL);
}
void PushIntoStack(PStack stack, const DataType data)
{
if(stack == NULL) {
perror("stack is null.");
return;
}
PStackNode topNode = (PStackNode)malloc(sizeof(StackNode));
if(topNode == NULL) {
perror("topNode malloc is null.");
return;
}
topNode->data = data;
topNode->next = stack->top;
stack->top = topNode;
stack->size++;
return;
}
void PopFromStack(PStack stack)
{
if(stack == NULL) {
perror("stack is null.");
return;
}
if(stack->top == NULL) {
perror("stack is empty.");
return;
}
PStackNode temp = stack->top;
stack->top = stack->top->next;
stack->size--;
return;
}
DataType GetTop(const PStack stack)
{
if(stack == NULL) {
perror("stack is null.");
return (DataType)STACK_ERR;
}
if(stack->top == NULL) {
perror("stack is empty.");
return (DataType)STACK_ERR;
}
return stack->top->data;
}
int GetStackSize(const PStack stack)
{
if(stack == NULL) {
perror("stack is null.");
return STACK_ERR;
}
return stack->size;
}
void DestroyStack(PStack stack)
{
if(stack == NULL) {
perror("stack is null.");
return;
}
while(stack->top != NULL) {
PStackNode temp = stack->top;
stack->top = temp->next;
free(temp); //release each node of the stack
}
free(stack); //release the stack node
printf("destroy stack completed.\n");
return;
}
/* 递归创建一个二叉树 */
void CreateBinTree(PBinTree *tree)
{
char ch;
scanf("%c",&ch);
if(ch == '#') {
*tree = NULL;
} else {
*tree = (PBinTree)malloc(sizeof(BinTree));
if(*tree == NULL) {
perror("tree malloc error.");
exit(BIN_TREE_ERR);
}
(*tree)->nodeValue = ch;
CreateBinTree(&(*tree)->leftChild);
CreateBinTree(&(*tree)->rightChild);
}
}
/* 二叉树先序遍历 */
void PreTraverTree(PBinTree tree)
{
if(tree != NULL) {
printf("%c ", tree->nodeValue);
if(tree->leftChild != NULL) {
PreTraverTree(tree->leftChild);
}
if(tree->rightChild != NULL) {
PreTraverTree(tree->rightChild);
}
}
}
/* 二叉树中序遍历 */
void InTraverTree(PBinTree tree)
{
if(tree != NULL) {
if(tree->leftChild != NULL) {
PreTraverTree(tree->leftChild);
}
printf("%c ", tree->nodeValue);
if(tree->rightChild != NULL) {
PreTraverTree(tree->rightChild);
}
}
}
/* 二叉树后序遍历 */
void PostTraverTree(PBinTree tree)
{
if(tree != NULL) {
if(tree->leftChild != NULL) {
PreTraverTree(tree->leftChild);
}
if(tree->rightChild != NULL) {
PreTraverTree(tree->rightChild);
}
printf("%c ", tree->nodeValue);
}
}
main.c
#include "binary_tree.c"
int main()
{
PBinTree myTree;
CreateBinTree(&myTree);
printf("create completed.\n");
PreTraverTree(myTree);
printf("pretrav completed.\n");
InTraverTree(myTree);
printf("Intraver completed.\n");
PostTraverTree(myTree);
printf("Posttrav completed.\n");
printf("\n");
return 0;
}