C语言递归实现二叉树的先序、中序、后序遍历

#include <stdio.h>
#include <stdlib.h>
//*****二叉树的二叉链表存储表示*****//
typedef struct BiNode
{
    char data;
    struct BiNode *lchild, *rchild;
}BiNode, *BiTree;  

//*****按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树构造二叉链表表示的二叉树T*****//
void CreateBiTree(BiTree &T)
{
    char ch;
    scanf("%c", &ch);
    if(ch == ' ')
    {
        T = NULL;
    }
    else
    {
        if(!(T = (BiNode *)malloc(sizeof(BiNode))))
        {
            return;
        }
        T->data = ch;                    //生成根结点
        CreateBiTree(T->lchild);     //构造左子树
        CreateBiTree(T->rchild);     //构造右子树
    }  

    return;
}  

//*****先序遍历二叉树*****//
void PreOrderTraverse(BiTree T)
{
    if(!T)
    {
        return;                             //若T为空树,则直接返回
    }
    printf("%c ", T->data);                  //访问根结点
    PreOrderTraverse(T->lchild);         //先序遍历左子树
    PreOrderTraverse(T->rchild);         //先序遍历右子树  

    return;
}  

//*****中序遍历二叉树*****//
void InOrderTraverse(BiTree T)
{
    if(!T)
    {
        return;                             //若T为空树,则直接返回
    }
    InOrderTraverse(T->lchild);              //中序遍历左子树
    printf("%c ", T->data);                  //访问根结点
    InOrderTraverse(T->rchild);              //中序遍历右子树  

    return;
}  

//*****后序遍历二叉树*****//
void PostOrderTraverse(BiTree T)
{
    if(!T)
    {
        return;                             //若T为空树,则直接返回
    }
    PostOrderTraverse(T->lchild);            //后序遍历左子树
    PostOrderTraverse(T->rchild);            //后序遍历右子树
    printf("%c ", T->data);                  //访问根结点  

    return;
}  

int main(void)
{
    BiTree T;
    printf("请按先序次序输入二叉树中结点的值(字符),空格字符表示空树:\n");
    CreateBiTree(T);      

    printf("先序遍历结果为:");
    PreOrderTraverse(T);
    printf("\n\n");   

    printf("中序遍历结果为:");
    InOrderTraverse(T);
    printf("\n\n");   

    printf("后序遍历结果为:");
    PostOrderTraverse(T);
    printf("\n\n");      

    return 0;
}    

以如下二叉树为例,给出按先序次序输入二叉树中结点的值(字符),从而按照本文给出的算法构造二叉树。

输入字符的顺序是:-+a空格空格*b空格空格-c空格空格d空格空格/e空格空格f空格空格,即可验证本文提供的遍历算法。

时间: 2024-08-07 11:52:22

C语言递归实现二叉树的先序、中序、后序遍历的相关文章

Java数据结构四之——二叉树的前、中、后序遍历

程序来自Program Creek 前 Preorder binary tree traversal is a classic interview problem about trees. The key to solve this problem is to understand the following: What is preorder? (parent node is processed before its children) Use Stack from Java Core lib

算法进化历程之“根据二叉树的先序和中序序列输出后序序列”

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 前不久在看到一个作业"根据二叉树的先序和中序序列输出后序序列",当时我参考<数据结构与算法(C语言)习题集>上的做法,先根据先中序序列确定一颗二叉树,然后后序遍历二叉树输出后序序列. 函数采用了递归算法,利用函数传入的先序和中序序列的左右边界,确定要处理的序列段,生成相应的二叉树. 基本思路是,把该段先序序列的第一个元素作为当前二叉树的根结点,然后在中序序列找到根结点.根结点

先序序列和后序序列并不能唯一确定二叉树

数据结构的基础知识中重要的一点就是能否根据两种不同遍历序列的组合(有三种:先序+中序,先序+后序,中序+后序),唯一的确定一棵二叉树.然后就是根据二叉树的不同遍历序列(先序.中序.后序),重构二叉树.显然,这三种组合并不是都能唯一确定二叉树的,其中先序+后序就不能唯一确定一棵二叉树,其他两种组合可以唯一的确定一颗二叉树. 由先序序列和后序序列不能唯一确定一棵二叉树,因无法确定左右子树两部分. 反例:任何结点只有左子树的二叉树和任何结点只有右子树的二叉树,其前序序列相同,后序序列相同,但却是两棵不

通过二叉树的中序序列和后序序列获取前序序列

二叉树的遍历方式常见的三种是:先序遍历(ABC).中序遍历(BAC).后序遍历(BCA) 先序遍历: 若二叉树为空,则空操作:否则: 访问根结点; 先序遍历左子树: 先序遍历右子树. 中序遍历: 若二叉树为空,则空操作:否则: 中序遍历左子树: 访问根结点: 中序遍历右子树. 后序遍历: 若二叉树为空,则空操作:否则: 后序遍历左子树: 后序遍历右子树: 访问根结点. 在学习到 根据遍历序列确定二叉树 时,知道了:可以通过二叉树的先中或者中后遍历序列唯一确定一棵二叉树. 根据算法描述 使用jav

中序表达式转后序表式式

中序表达式转后序表式式: 将中序表达式所有括号补全,然后将所有运算符向右移出无匹配的第一个右括号,去掉括号即为后序表式式 举例: 原式:a+b*(c+d/e) 补全括号:(a+(b*(c+(d/e)))) 操作符右移:(a(b(c(de)/)+)*)+ 去掉括号:abcde/+*+ 中序表达式转前序表式式: 将中序表达式所有括号补全,然后将所有运算符向左移出无匹配的第一个左括号,去掉括号即为前序表式式 举例: 原式:a+b*(c+d/e) 补全括号:(a+(b*(c+(d/e)))) 操作符右移

二叉树遍历算法——包含递归前、中、后序和层次,非递归前、中、后序和层次遍历共八种

首先,要感谢网上的参考资料. http://mengliao.blog.51cto.com/876134/1178079(作者:BlackAlpha) http://blog.csdn.net/fzh1900/article/details/14056735(作者:_云淡风轻) http://blog.csdn.net/stpeace/article/details/8138458(作者:stpeace) 二叉树是使用的比较广泛的一种数据结构,这里我写了二叉树的相关操作,包括初始化.新建.以及遍

非递归求二叉树的前序、中序和后序遍历

一.前序遍历 分析: 1.前序遍历是中左右,因此利用栈,记录栈顶根结点的同时,先压右子树,后压左子树,从而先遍历左子树. 2.每次弹出的栈顶结点符合前序遍历的顺序,因此可直接记录. 3.注意:由于压入栈的是树的结点,所以栈内数据类型为Node*. struct Node{ int val; Node *left, *right; }; vector<int> get_preorder(Node *root){ vector<int> preorder; stack<Node*

hdu1710-Binary Tree Traversals (由二叉树的先序序列和中序序列求后序序列)

http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4210    Accepted Submission(s): 1908 Problem Description A binary tree is a

华南理工数据结构大作业第二题 二叉树各种操作深度结点个数后序前序中序层次求祖先

/*#include<iostream> #include<windows.h> using namespace std ; struct BTNode { char data ; BTNode *left ; BTNode *right ; BTNode () { left = NULL ; right = NULL ; } } ; int main () { cout <<"题目所给的二叉树用括号表示法后表示为:A(B(D,E(H(J,K(L,M(,N))