二叉树的创建及遍历算法的递归实现

通用的算法实现,不多说,直接上代码;
需要注意的是在创建的时候传入的是根地址,在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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

存墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值