剑指offer(C++)-JZ7:重建二叉树(数据结构-树)

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

给定节点数为 n 二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。

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

提示:

1.vin.length == pre.length

2.pre 和 vin 均无重复元素

3.vin出现的元素均出现在 pre里

4.只需要返回根结点,系统会自动输出整颗树做答案对比

数据范围:n≤2000,节点的值:−10000≤val≤10000

要求:空间复杂度 O(n),时间复杂度 O(n)

示例:

输入:

[1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]

返回值:

{1,2,3,4,#,5,6,#,7,#,#,8}

说明:

返回根节点,系统会输出整颗二叉树对比结果,重建结果如题面图示

解题思路:

本题考察数据结构树的使用。根据前序、中序、后序的排序重建二叉树是很常见的题目,也很基础。本题是前序和中序,前序遍历的顺序是:根结点->左子树->右子树,中序遍历的顺序是:左子树->根结点->右子树。即根节点存在前序首个位置,也存在中序遍历中间的某个位置,那么中序遍历根节点左侧的就是左子树,而前序遍历根节点后面同等数量的结点也是左子树,将这两个左子树类似操作,寻找左子树的根节点,右侧右子树同理。依次类推一层层锁定根节点,用递归很轻易的就能还原二叉树。

测试代码:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        // 递归法
        if(pre.size()==0)
            return nullptr;
        int first=pre[0],pos_in_mid=0;
        TreeNode* head=new TreeNode(first);
        for(pos_in_mid=0;pos_in_mid<vin.size();++pos_in_mid)
        {
            if(vin[pos_in_mid]==first)
                break;
        }
        head->left=reConstructBinaryTree(
            {pre.begin()+1,pre.begin()+1+pos_in_mid}, {vin.begin(),vin.begin()+pos_in_mid});
        head->right=reConstructBinaryTree(
            {pre.begin()+1+pos_in_mid,pre.end()}, {vin.begin()+1+pos_in_mid,vin.end()});
        return head; 
    }
};

猜你喜欢

转载自blog.csdn.net/zhaitianbao/article/details/122697606