6-4 二叉树的递归遍历(C语言解法)(PTA)

题目描述

要求使用递归算法实现二叉树的先序遍历、中序遍历和后序遍历。

函数接口定义:
void PreorderTraversal(BinTree BT)   /* 二叉树的先序遍历 */ 
void InorderTraversal(BinTree BT)   /* 二叉树的中序遍历 */ 
void PostorderTraversal(BinTree BT)    /* 二叉树的后序遍历 */
其中,BinTree 的结构定义为:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};
要求3个函数分别按照访问顺序打印出结点的内容,字符之间无空格

裁判测试程序样例:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100

typedef struct TNode * BinTree;   /* 二叉树类型 */
typedef char ElementType;
struct TNode{    /* 树结点定义 */ 
    ElementType Data;  /* 结点数据 */
    BinTree Left;   /* 指向左子树 */ 
    BinTree Right;   /* 指向右子树 */ 
}; 



void PreorderTraversal(BinTree BT) ;  /* 二叉树的先序遍历 */ 
void InorderTraversal(BinTree BT);   /* 二叉树的中序遍历 */ 
void PostorderTraversal(BinTree BT);    /* 二叉树的后序遍历 */

//按先序次序输入二叉树中结点的值(一个字符),@表示空树,构造二叉链表表示二叉树T 
BinTree CreatBinTree()
{
    ElementType ch;
    BinTree T;
    scanf("%c",&ch); /*按先序次序输入树的结点,空树输入@*/
    if(ch == '@')
       T = NULL;
    else {
        T = (BinTree)malloc(sizeof(struct TNode));
        T->Data = ch;
        T->Left = CreatBinTree();
        T->Right = CreatBinTree();
    }
return T;
}

int main()
{
    BinTree BT;
    BT = CreatBinTree();

    if(BT == NULL){
        printf("\n空树!\n"); 
    }else{
        printf("先序遍历的结果为:"); 
        PreorderTraversal(BT);
        printf("\n"); 

        printf("中序遍历的结果为:"); 
        InorderTraversal(BT);
        printf("\n"); 

        printf("后序遍历的结果为:"); 
        PostorderTraversal(BT);
    } 
    return 0;
}
/* 请在这里填写答案 */

解题思路

个人认为这是最简单的关于二叉树的应用了,只需要理解概念,带点感觉就能把这个递归写出来

C语言解法

void PreorderTraversal(BinTree BT)   /* 二叉树的先序遍历 */ 
{
    // 递归出口
    if(BT==NULL)return; // 当节点到达空树时,return实现回溯
    
    // 先序遍历的逻辑: 访问根节点->左子树->右子树    
    printf("%c",BT->Data); 

    PreorderTraversal(BT->Left);
    // 回溯出口,return后继续向右递归访问子树
    PreorderTraversal(BT->Right);
    
}

void InorderTraversal(BinTree BT)   /* 二叉树的中序遍历 */ 
{
    if(BT==NULL)return;

    // 中序遍历的逻辑: 访问左子树->根节点->右子树
    InorderTraversal(BT->Left);
    printf("%c",BT->Data);
    InorderTraversal(BT->Right);
}


void PostorderTraversal(BinTree BT)    /* 二叉树的后序遍历 */
{
    if(BT==NULL)return;

    // 后序遍历的逻辑: 访问左子树->右子树->根节点
    PostorderTraversal(BT->Left);
    PostorderTraversal(BT->Right);
    printf("%c",BT->Data);
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值