二叉树(Binary Tree)的递归遍历(一)

二叉树(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.

 

转载于:https://my.oschina.net/xinxingegeya/blog/275331

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值