NC12 重建二叉树

题目描述:给定某二叉树的前序遍历和中序遍历,请重建出该二叉树并返回它的头结点。

示例:例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。

解题思路:在解决这题之前,我们需要知道如何从前序遍历序列和中序遍历序列中重见二叉树。

简要步骤如下:

1.前序遍历的首个元素{ 1,2,4,7,3,5,6,8}作为二叉树的根节点。

2.在中序序列中找到第一次这个元素出现的地方{ 4,7,2,1,5,3,8,6}。

3.将中序遍历序列分割为左右两份,左边的{4,7,2}在根节点的左边,右边的{5,3,8,6}在根节点的右边。

4.分割后,左子树的前序为{2,4,7},中序为{4,7,2},右子树前序为{3,5,6,8},中序为{5,3,8,6}。

5.采用递归实现,依次重复上述步骤即可实现。

    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        //求取数组长度
        if(pre.size()<1)
            return nullptr;
        int aSize = pre.size();
        //找出pre第一个数字在vin中的位置
        int preFirstpos;
        for(int i=0;i<aSize;i++)
        {
            if(vin[i] == pre[0])
            {
                preFirstpos = i;
                break;
            }
        }
        //将前序遍历序列和中序遍历序列中的左子树分割
        TreeNode *head = new TreeNode(pre[0]);
        vector<int> pre1(pre.begin()+1,pre.begin()+preFirstpos+1);
        vector<int> vin1(vin.begin(),vin.begin()+preFirstpos);
        head->left = reConstructBinaryTree(pre1,vin1);
        //将前序遍历序列和中序遍历序列中的右子树分割
        vector<int> pre2(pre.begin()+preFirstpos+1,pre.end());
        vector<int> vin2(vin.begin()+preFirstpos+1,vin.end());
        head->right = reConstructBinaryTree(pre2, vin2);
        return head;
    }

猜你喜欢

转载自blog.csdn.net/pigbossa/article/details/120363692
今日推荐