二叉树(Binary Tree)的递归遍历(一)
C语言实现:构造一棵最简单的二叉树,先序序列是123。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef char TElemType;
typedef int Status;
//---------------二叉树的二叉链表存储表示---------------
typedef struct BinaryTreeNode {
TElemType data;
struct BinaryTreeNode *lchild, *rchild; // 左右孩子指针
} BinaryTreeNode, *BinaryTree;
//----------------基本操作的函数原型说明(部分)-------------
Status CreatBinTree(BinaryTree *T);
//按先序次序输入二叉树中结点的值(一个字符),#字符表示空树
//构造二叉链表表示的二叉树T
BinaryTree CreateBiTree(void);
//按先序次序输入二叉树中结点的值(一个字符),#字符表示空树
//构造二叉链表表示的二叉树T
Status PreOrderTraverse(BinaryTree T, Status (* Visit)(TElemType e));
//采用二叉链表存储结构,Visit是对结点操作的应用函数。
//先序遍历二叉树,对每个结点调用函数 visit 一次且仅一次。一旦 visit() 失败,则操作失败。
Status InOrderTraverse(BinaryTree T, Status (* Visit)(TElemType e));
//采用二叉链表存储结构,Visit是对结点操作的应用函数。
//中序遍历二叉树,对每个结点调用函数 visit 一次且仅一次。一旦 visit() 失败,则操作失败。
Status PostOrderTraverse(BinaryTree T, Status (* Visit)(TElemType e));
//采用二叉链表存储结构,Visit是对结点操作的应用函数。
//后序遍历二叉树,对每个结点调用函数 visit 一次且仅一次。一旦 visit() 失败,则操作失败。
Status Visit(TElemType e);
int main(){
BinaryTree T = NULL;
printf("按照先序序列输入二叉树:\n");
//T = CreateBiTree();
CreatBinTree(&T);
Status (* p)(TElemType) = Visit;
printf("递归方式先序遍历:\n");
PreOrderTraverse(T,p);
printf("\n递归方式中序遍历:\n");
InOrderTraverse(T,p);
printf("\n递归方式后序遍历:\n");
PostOrderTraverse(T,p);
return 0;
}
Status CreatBinTree(BinaryTree *T)
{
char c;
c=getchar();
if (c=='#'){
(*T)=NULL;
}else{
(*T)=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
(*T)->data=c;
CreatBinTree(&(*T)->lchild);
CreatBinTree(&(*T)->rchild);
}
return OK;
}
//先序序列递归构造
//指针传值调用
BinaryTree CreateBiTree(void){
BinaryTree T;
char ch;
scanf("%c", &ch);
if (ch == '#') { //读入#表示空树
T = NULL;
}else{
T = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
T->data = ch; //生成根节点
T->lchild = CreateBiTree(); //构造左子树
T->rchild = CreateBiTree(); //构造右子树
}
return T;
}
//先序遍历二叉树T的递归算法
//先根序
Status PreOrderTraverse(BinaryTree T, Status (* Visit)(TElemType e)){
if(T){
if(Visit(T->data)){ //访问数据
if(PreOrderTraverse(T->lchild,Visit)){//先序遍历左子树
if(PreOrderTraverse(T->rchild,Visit)){//先序遍历右子树
return OK;
}
}
}
} else {
return OK;
}
}
//中序遍历二叉树的递归算法
//中根序
Status InOrderTraverse(BinaryTree T, Status (* Visit)(TElemType e)){
if(T){
if(InOrderTraverse(T->lchild,Visit)){
if(Visit(T->data)){
if(InOrderTraverse(T->rchild,Visit)){
return OK;
}
}
}
} else {
return OK;
}
}
//后序遍历二叉树的递归算法
//后根序
/**
*遍历左子树
*遍历右子树
*访问根节点
*/
Status PostOrderTraverse(BinaryTree T, Status (* Visit)(TElemType e)){
if(T){
if(PostOrderTraverse(T->lchild,Visit)){
if(PostOrderTraverse(T->rchild,Visit)){
if(Visit(T->data)){
return OK;
}
}
}
} else {
return OK;
}
}
//这是最简单的Visit函数
Status Visit(TElemType e)
{
printf("%c", e);
return OK;
}
运行:
按照先序序列输入二叉树:
12##3##
递归方式先序遍历:
123
递归方式中序遍历:
213
递归方式后序遍历:
231
Process returned 0 (0x0) execution time : 6.524 s
Press any key to continue.