建立二叉树,实现二叉树的先序,中序遍历的递归算法

先序遍历:若二叉树为空,则空操作;否则访问根节点;先序遍历左子树;先序遍历右子树。
中序遍历:若二叉树为空,则空操作;否则中序遍历左子树;访问根节点;中序遍历右子树。

/*
* Created by Microsoft Visual Studio 2013
* @author: Teresa
* @date: 2017-10-20
* @description: 二叉树遍历 递归 
*/

#include <stdio.h>
#include <stdlib.h>
/*函数状态码*/
#define TRUE 1	//成功
#define OK 1
#define FALSE 0	//失败 
#define ERROR 0	//错误 
#define INFEASIBLE -1	//不可行的
#define OVERFLOW -2 	//溢出

typedef int Status;	//函数的返回值类型 
 
//二叉树的二叉链表存储表示
typedef char TElemType;
typedef struct BiNode
{
    TElemType data;
    struct BiNode *lchild, *rchild;
} BiNode , *BiTree;
 
//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,构造二叉链表表示的二叉树T。
Status CreatBiTree(BiTree *T)
{
    char ch;
    scanf("%c", &ch);
 
    //如果当前输入的字符为空格,则(*T)指向空树。
    if (ch == ' ')
    {
        (*T) = NULL;
    }
    else
    {
        if (!((*T) = (BiTree)malloc(sizeof(BiNode))))
            exit(OVERFLOW);
        (*T)->data = ch;             //生成根结点
        CreatBiTree(&((*T)->lchild));    //构造左子树
        CreatBiTree(&((*T)->rchild));    //构造右子树
    }
    return OK;
}
 

//采用二叉链表存储结构,Visit是对数据元素操作的应用函数,
//先序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
Status PreOrderTraverse_Recursive(BiTree T, Status(*Visit)(TElemType e))
{
    if (T)
    {
        if (Visit(T->data))
            if (PreOrderTraverse_Recursive(T->lchild, Visit))
                if (PreOrderTraverse_Recursive(T->rchild, Visit))
                    return OK;
        return ERROR;   
    }
    else
        return OK;  //当T为空树时,停止递归。
}

//中序遍历 递归实现 
Status InOrderTraverse_Recursive(BiTree T, Status(*Visit)(TElemType e))
{
    if (T)
    {
        if (InOrderTraverse_Recursive(T->lchild, Visit))
            if (Visit(T->data))
                if (InOrderTraverse_Recursive(T->rchild, Visit))
                    return OK;
        return ERROR;
    }
    else
        return OK;
}

//后序遍历 递归实现 
Status PostOrderTraverse_Recursive(BiTree T, Status(*Visit)(TElemType e))
{
    if (T)
    {
        if (PostOrderTraverse_Recursive(T->lchild, Visit))
            if (PostOrderTraverse_Recursive(T->rchild, Visit))
                if (Visit(T->data))
                    return OK;
        return ERROR;
    }
    else
        return OK;
}

//遍历数据元素时所调用函数
Status PrintElement(TElemType e)
{
    putchar(e);
    return OK;
}
 
int main()
{
    BiTree T;
    CreatBiTree(&T);
    //先序
    printf("先序:\n");
    PreOrderTraverse_Recursive(T, PrintElement);
    printf("\n");
    //中序
	printf("中序:\n"); 
    InOrderTraverse_Recursive(T, PrintElement); 
    printf("\n");
    //后序
    printf("后序:\n"); 
    PostOrderTraverse_Recursive(T, PrintElement);
    printf("\n");
    system("pause");
    return 0;
}
    原文作者:递归算法
    原文地址: https://blog.csdn.net/qq_36894136/article/details/78381360
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞