为了账号安全,请及时绑定邮箱和手机立即绑定

(C语言-数据结构)还原二叉树-改进

第一次写的算法老师给予了建议如下:
对于问题本身,你能正确输出后序序列,说明二叉树已经正确建立了

对于代码,有些可改进的地方

  1. void subLm(char A[], char B[], char C);//获取中序遍历的左边
    这些函数的参数,数组类型用了大写字母,单个的字符用小写字母更好一些,对于可读性

  2. 具体实现的时候,你使用了很多的临时数组变量,其实是可以避免的:
    由始至终先序和中序字符串都没改变,因此,每次只需要记录下临时数组对应的左右两个位置即可、而不用把数组的这些元素复制出来,这样函数的参数只需要传递这左右两个位置变量即可

#include<stdio.h>
#include<stdlib.h>
#define MAX 20
char preOrder[MAX] = "abdgcefh";//定义全局变量,先序字符串
char midOrder[MAX] = "dgbaechf";//中序字符串
struct TreeNode{
	char data;
	TreeNode *Lnode;
	TreeNode *Rnode;
};
int strlength(char * str){//计算长度
	int a = 0;
	while (*str++ != '\0')
		a++;
	return a;
}
void formPrint(TreeNode *T){//后序输出二叉树
	if (T == NULL)
		return;
	formPrint(T->Lnode);
	formPrint(T->Rnode);
	printf("%c", T->data);
}
int match(char target, char *data){
	int address = 0;//在data中找到target并返回target位置
	for (; data[address] != '\0'; address++)
		if (data[address] == target)
			return address;
	return -1;
}
int restore(TreeNode *&T,char *pc,char *mc,int &adrs,int head,int rear){
	char temp = pc[adrs++];//依次提取先序字符串中的单个字符
	int abc = match(temp, mc);//abc为temp在中序字符串中的位置
	//每一次把中序字符串分成两部分,以temp为参考的左边和右边
	//左边:记录左边的头mLch 尾mLcr 右边:头mRch 尾mRcr
	int mLch = head, mLcr = abc - 1;
	int mRch = mLcr + 2, mRcr = rear;
	int x = abc - mLch, y = mRcr - abc;//x为左边字符串长度,y为右边长度
	T = new TreeNode;
	T->data = temp;
	if (!x)
		T->Lnode = 0;
	else
		restore(T->Lnode,pc,mc,adrs,mLch,mLcr);
	if (!y)
		T->Rnode = 0;
	else
		restore(T->Rnode,pc,mc,adrs,mRch,mRcr);
	return 0;
}
int main(){
	TreeNode *T = NULL;//定义头结点然后初始化
	int i = 0,k=strlength(preOrder)-1;
	restore(T, preOrder, midOrder,i,0,k);
	//i为先序地址浏览整个先序数组,0为首地址,字符串首地址规定为0
	formPrint(T);
	return 0;
}

按照老师给的建议,不在定义临时数组只记录首尾,整体看上去很简洁,思路和上次的算法一样,唯一改变的是仅仅用首尾来记录数组

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
30
获赞与收藏
154

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消