重建二叉树c++

来源:互联网 发布:java中遍历jsonarray 编辑:程序博客网 时间:2024/05/22 06:28

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

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

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

我的想法呢,额

首先手动分析一下;

例如

前序遍历结果: 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 跟之前手动分析一样

明显。。对了嘛

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