题目描述
要求使用递归算法实现二叉树的先序遍历、中序遍历和后序遍历。
函数接口定义:
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);
}