建立森林,并进行先序和中序遍历(C语言代码实现)

森林先序遍历算法思想:先访问森林中一棵树的根节点,依次对该树的结点(子树的根)进行先根遍历,最后先序遍历森林中其余待访问的树。

森林的中序遍历算法思想:对第一颗树的结点(子树的根)进行后根遍历,然后访问该树的根节点,再对森林中其他树进行中序遍历.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char ElemType;
typedef struct CSTNode {
	ElemType data;
	struct CSTNode* firstChild;
	struct CSTNode* nextSibling;
}CSTNode,*CSTree;
//先序创建森林(孩子兄弟链)
void creatCSTree(CSTree& T) {
	ElemType ch;
	scanf("%c", &ch);
	if (ch == '#') {
		T = NULL;
	}
	else {
		T = (CSTNode*)malloc(sizeof(CSTNode));
		T->data = ch;
		creatCSTree(T->firstChild);
		creatCSTree(T->nextSibling);
	}
}
//先序遍历二叉树,检验建树是否成功
//void preOrder(CSTree T) {
//	if (T != NULL) {
//		printf("%c", T->data);
//		preOrder(T->firstChild);
//		preOrder(T->nextSibling);
//	}
//}
//树的先根遍历算法
void preOrder(CSTNode* pnode) {
	if (pnode != NULL) {
		printf("%c", pnode->data);//访问根结点
		CSTNode* pcurchild = pnode->firstChild;//获取第一棵子树
		while (pcurchild != NULL) {//依次访问每一棵子树
			preOrder(pcurchild);//先根遍历子树
			pcurchild = pcurchild->nextSibling;//指向T的另一棵子树
		}
	}
}
//先序遍历森林
//算法思想:先访问森林中一棵树的根节点,依次对该树的结点(子树的根)进行先根遍历,最后先序遍历森林中其余待访问的树
void preOrderTraves(CSTree T) {
	if (T != NULL) {
		printf("%c", T->data);//访问第一颗树的根节点
		//依次对该树的结点(子树的根)进行先根遍历
		for (CSTNode* pcurchild = T->firstChild; pcurchild != NULL; pcurchild = pcurchild->nextSibling) {
			preOrder(pcurchild);
		}
		//先序遍历森林中其他的树
		preOrderTraves(T->nextSibling);
	}
}
//树的后跟遍历,先访问每棵子树,最后访问根节点
void postOrder(CSTree T) {
	if (T != NULL) {
		CSTNode* pcurchild = T->firstChild;//获取第一棵子树
		while (pcurchild != NULL) {//依次访问每一棵子树
			postOrder(pcurchild);//后序访问子树
			pcurchild = pcurchild->nextSibling;//访问另一棵子树
		}
		printf("%c", T->data);//访问根节点
	}
}
//森林的中序遍历
//算法思想:对第一颗树的结点(子树的根)进行后根遍历,然后访问该树的根节点,再对森林中其他树进行中序遍历
void inOrderTrave(CSTree T) {
	if (T != NULL) {
		//对第一颗树的结点(子树的根)进行后根遍历
		for (CSTNode* pcurchild = T->firstChild; pcurchild != NULL; pcurchild = pcurchild->nextSibling) {
			postOrder(pcurchild);
		}
		printf("%c", T->data);//访问树的根节点
		inOrderTrave(T->nextSibling);//对森林中其他树进行中序遍历
	}
}
//AB#D#E##C#RS#T###
int main() {
	CSTree T = NULL;
	creatCSTree(T);
	//preOrder(T);//检验建森林是否成功
	//printf("\n");
	preOrderTraves(T);//先序遍历森林
	printf("\n");
	inOrderTrave(T);//中序遍历森林
	printf("\n");
	return 0;
}

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
抱歉,我无法绘制图像。但是,我可以帮助你理解先序遍历和中序遍历以及它们之间的关系。 先序遍历是一种遍历二叉树的方式,它的顺序是先访问根节点,然后依次遍历左子树和右子树。中序遍历是一种遍历二叉树的方式,它的顺序是先遍历左子树,然后访问根节点,最后遍历右子树。 对于给定的二叉树,我们可以通过先序遍历和中序遍历的结果来构建出这棵树。下面是一个示例: 假设我们有以下的先序遍历和中序遍历结果: 先序遍历:A B D E C F 中序遍历:D B E A F C 首先,我们可以确定根节点是A,因为先序遍历的第一个元素总是根节点。接下来,我们在中序遍历结果中找到根节点A,可以将中序遍历结果分成两部分:左子树和右子树。 左子树的中序遍历结果为:D B E 右子树的中序遍历结果为:F C 然后,我们可以通过左子树的中序遍历结果来确定左子树的先序遍历结果和构建左子树。在先序遍历结果中,左子树的节点紧跟在根节点之后,所以左子树的先序遍历结果为:B D E。 同样地,我们可以通过右子树的中序遍历结果来确定右子树的先序遍历结果和构建右子树。在先序遍历结果中,右子树的节点紧跟在左子树节点之后,所以右子树的先序遍历结果为:F C。 我们可以继续递归地进行这个过程,直到所有的节点都被处理完毕。最终,我们就可以得到一棵完整的二叉树。 希望这个解释能帮到你!如果有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值