C语言实现二叉树的重载

C语言实现二叉树的重载:

通过二叉树的中序遍历顺序和前序(或后序)遍历顺序还原二叉树;
这里是前序和中序,通过递归实现。

typedef struct BTNode {		// 孩子表示法
	char data;
	struct BTNode* lchild, *rchild;
}BTNode;
			
			
BTNode* CreateRoot(char c) {//生成根节点的函数
	BTNode* tmp = (BTNode*)malloc(sizeof(BTNode));
	if (!tmp) {
		printf("申请空间失败,无法创建根节点\n");
	}
	else {
		tmp->data = c;
		tmp->lchild = NULL;
		tmp->rchild = NULL;
	}
	return tmp;
}


BTNode* RestoreTree(char* ppos, char* ipos, int n) {		// ppos是先序遍历顺序,ipos是中序遍历顺序;
	if (strlen(ipos) == 0) {
		return NULL;										// 如果ipos长度为9,那么表明没有孩子,置为NULL;
	}
	static char* pppos = ppos;								// 一个静态指针变量,指向先序遍历;
	int i = 0, leftStrlen = 0, k = 0, rightStrlen = 0;
	char left[100], right[100];
	BTNode* root = CreateRoot(ppos[0]);		// 先序的第一个值是根节点
	
	while (ipos[i] != ppos[0]) {
		left[leftStrlen++] = ipos[i];		// 把在中序顺序中,把根节点左边的顺序保存
		i++;
	}left[leftStrlen] = '\0';
	
	while (++i<n){
		right[rightStrlen++] = ipos[i];		// 把在中序顺序中,根节点右边的顺序保存,这样就做到把左右子树分开了,接下来递归就可以了。
	}right[rightStrlen] = '\0';
	
	if (strlen(left) == 0) root->lchild = RestoreTree(pppos, left, leftStrlen);	// 如果左边的字符串为空,则没有左子树,指针不需要后移
    else root->lchild = RestoreTree(++pppos, left, leftStrlen); 
	if (strlen(right) == 0) root->rchild = RestoreTree(pppos, right, rightStrlen);// 同理
	else root->rchild = RestoreTree(++pppos,right, rightStrlen);
	return root;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jchenn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值