根据先序序列和中序序列创建二叉树——递归及非递归实现详细讲解

二叉树存储结构:

typedef struct Tnode
{
	char data;
	struct Tnode *lnode;
	struct Tnode *rnode;
}Tnode;
typedef  Tnode* type;

递归创建二叉树:

Tnode *createtree6(char a[], int n1,int m1,char b[],int n2,int m2)
{
	//根据先序和中序遍历结果创建唯一确定的二叉树,递归进行,每次划分数组序列,确定左子树和右子树的结点集合,直至每个集合里的元素只有一个时,可以建立一个树
	//b为中序序列,a为先序序列
	//设计思路:如果a,b的长度不相等或者两个长度都为0则返回出错
	//以先序序列a的首结点为根节点,再在中序序列中找到此节点,左边部分是根节点的左子树节点,右半部分是根节点的右子树节点。故可以采用递归的方法建树
	//因此若要进行划分就要输入上界与下界。
	//if(a.len != b.len || a.len == 0)
		//return -1;
	Tnode *root = (Tnode *)malloc(sizeof(Tnode));
	if (root)//分配动态空间成功
		root->data = a[n1];
	else
		exit(-1);
	int i,llen,rlen;
	i = llen = rlen = 0;
	for (; b[i] != a[n1]; i++);//找到根节点在中序序列的下标i;
	llen = i - n2;//说明要以当前root为根节点对需要建树的序列b左子树长
	rlen = m2 - i;//说明要以当前root为根节点对需要建树的序列b右子树长
	if (llen&&(root->lnode = createtree6(a, n1+1, n1+llen, b, n2, n2+llen-1) ));//当左子树长不为零时建左子树
	else  root->lnode = NULL;//新的建树序列(新的中序序列)对应b的起始下标n2,结束下标n2+len-1;新的参考序列(新的先序序列)对应a的起始坐标n1+1,结束坐标n1+len;
		if(rlen  && (root->rnode = createtree6(a,m1-rlen+1, m1, b, m2-rlen+1, m2)));//当右子树长不为零时建右子树
    else  root->rnode = NULL;//新的建树序列(新的中序序列)对应b的起始下标m2-rlrn+1,结束下标m2;新的参考序(新的先序序列)列对应a的起始坐标m1-rlen+1,结束坐标m1;
		return root;
}

非递归创建二叉树:

Tnode *norecur_createtree6(char a[], int alen, char b[])
{//此算法经过最终测试,对于大多数的实例都有完美的准确度,不过是非平衡树的时候就会出错。
//改进思路:在判断出其左孩子和右孩子为空后记录个数,并将其补为完全二叉树,根据下标对应关系赋值
	Tnode *root[7];
	for (int i = 0; i < alen; i++)
	{
		root[i] = (Tnode *)malloc(sizeof(Tnode));
		if (root[i])//分配动态空间成功
		{
			root[i]->data = a[i];
			root[i]->lnode = root[i]->rnode=NULL;
		}
		else
			exit(-1);
	}
	int i = 0;
	while (ik)
			{
				root[i]->lnode = root[i+1];

			}
			else
			{
				root[i]->lnode = NULL;
				flag = 1;//说明其左子树为空
			}
			//给根节点创建右子树
			
			for (tem = (i > save ? j+1: j + 1 + i); b[m] != a[tem]; m++);
			if (m > j&&!flag&&mrnode = root[tem];
			}
			else if (flag&&a[i+1]==b[j+1])//如果左子树为空再判断中序和前序序列中当前节点的下一个节点是否一致,如果是,说明下一个节点就是其右孩子,如果不是则说明其没有右孩子
				root[i]->rnode = root[1 + i];
			else
				root[i]->rnode = NULL;
			i++;

		}

	return root[0];
}

你可能感兴趣的:(数据结构与算法)