c++根据二叉树的层次遍历建立二叉树_C++已知先序遍历序列中序遍历序列建立二叉树;已知后序遍历序列中序遍历序列建立二叉树...

如题,已知先序中序/后序中序建立一棵二叉树。

我们手工建树的时候,比如一个例子:先序序列:ADECFG,中序序列:DBEAFCG。首先我们都会从先序序列中找到第一个元素A,该元素也就是这个树的根。然后再在中序序列中找到一样的元素A,,这样会将中序序列分成两个子序列(DBE) (FCG),分别是左子树与右子树。然后将子序列再看成一棵树。显然这是一个递归的过程。所以只需要把首层的搞清楚。

  • 算法思想:两个数组a[], b[], 分别是树的先序序列和中序序列。p1,q1代表a[]的首尾;p2,q2代表b[的首尾。首先先取a[p1]的值(也就是例子中的A),其次在b[]中找到该值,并返回下标。定义llen(左子树长度),rlen(右子树长度)。求出分得的子序列长度执行递归即可。//函数参数列表 CreateLBTree1(LBTree*& lbt, char a[], char b[], int p1, int q1, int p2, int q2)
  • 算法C++描述
​
//先序中序确定树
void CreateLBTree1(LBTree*& lbt, char a[], char b[], int p1, int q1, int p2, int q2)
{
	int llen, rlen;
	lbt = (LBTree*)malloc(sizeof(LBTree));
	lbt->data = a[p1];
	int i;
	for (i = p2; b[i] != lbt->data; ++i);
	llen = i - p2;
	rlen = q2 - i;
	if (llen)
		CreateLBTree1(lbt->lchild, a, b, p1 + 1, p1 + llen, p2, p2 + llen - 1);
	else
		lbt->lchild = NULL;
	if (rlen)
		CreateLBTree1(lbt->rchild, a, b, q1 - rlen + 1, q1, q2 - rlen + 1, q2);
	else
		lbt->rchild = NULL;
}

​

8cf0b7f487427e0f4c1debd8292b18fe.png
  • 后序中序建树的过程与之相似这里只提供代码:
​
//后序中序确定树
void CreateLBTree2(LBTree*& lbt, char a[], char b[], int p1, int q1, int p2, int q2)
{
	int llen, rlen;
	lbt = (LBTree*)malloc(sizeof(LBTree));
	lbt->data = a[q1];
	int i;
	for (i = p2; b[i] != lbt->data; ++i);
	llen = i - p2;
	rlen = q2 - i;
	if (llen)
		CreateLBTree2(lbt->lchild, a, b, p1, p1 + llen - 1, p2, p2 + llen - 1);
	else
		lbt->lchild = NULL;
	if (rlen)
		CreateLBTree2(lbt->rchild, a, b, q1 - rlen, q1 - 1, q2 - rlen + 1, q2);
	else
		lbt->rchild = NULL;
}

​

8cf0b7f487427e0f4c1debd8292b18fe.png


该算法的关键就是在调用递归函数时的参数的赋值。也就是子序列首尾的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值