假设有了前序遍历和中序遍历,希望重建这颗树。
在编程之美里看见了这题,于是就心血来潮,写出了下面的算法,不过。。。也不知道对不对, 因为后来看见书上的代码有点长,不知道是不是我考虑不周。
如果知道遍历的结果,我们手动的话很容易就将一棵树还原了,但是通过代码怎么弄呢?
我的想法呢,额
首先手动分析一下;
例如
前序遍历结果: 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 跟之前手动分析一样
明显。。对了嘛
如果发现不对,麻烦指正~~~不尽感谢