重建二叉树c++

本文介绍了如何根据前序和中序遍历结果重建二叉树。通过分析遍历结果并运用递归思想,实现了从遍历序列到二叉树的转换,并给出了C++代码实现。手动分析和实际运行结果表明,代码正确地重建了二叉树。
摘要由CSDN通过智能技术生成

假设有了前序遍历和中序遍历,希望重建这颗树。

在编程之美里看见了这题,于是就心血来潮,写出了下面的算法,不过。。。也不知道对不对, 因为后来看见书上的代码有点长,不知道是不是我考虑不周。

如果知道遍历的结果,我们手动的话很容易就将一棵树还原了,但是通过代码怎么弄呢?

我的想法呢,额

首先手动分析一下;

例如

前序遍历结果: a b d c e f

中序遍历结果: d b a e c f

看前序,a在第一位,所以a 是根,然后在中序中找到a, 分成两部分,在a左边的是左子树,在 右边的是右子树,用递归思想来处理

可得:

                 a

              /     \

           b        c

        /           /   \

     d          e       f

树的后序遍历为:d b e f c a

代码:

typedef struct Node
{
	char code;
	Node *left;
	Node *right;
}Tree, *Position;

string  mid;//存储前序遍历的结果
string  mid;;//存储中序遍历的结果

void Creat(Position &root, int i, int left, int right)//建树 i是前序的当前访问, left是中序遍历左边界,right是中序遍历的右边界
{
	if (left > right || i >= pre.size())
		root = NULL;
	else 
	{
		root = new Tree;//如果当前节点不是空就建立节点
		root->code = pre.at(i);

		for (int k = left; k<= right; k++)//在中序中找到当前节点的位置
			if (mid.at(k) == pre.at(i)) break;

		Creat(root->left, ++i, left, k-1);//递归处理左子树
		Creat(root->right, k - left + i, k+1, right);//递归处理右子树。k - left + i 计算出右子树的左边界
	}
}


结果生成的树的后序遍历为:d b e f c a 跟之前手动分析一样

明显。。对了嘛

如果发现不对,麻烦指正~~~不尽感谢


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值