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

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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; 
    
;

以上是关于剑指offer(C++)-JZ7:重建二叉树(数据结构-树)的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer(C++版本)系列:剑指 Offer 07 重建二叉树

剑指 Offer(C++版本)系列:剑指 Offer 07 重建二叉树

剑指 Offer(C++版本)系列:剑指 Offer 07 重建二叉树

剑指Offer第四题重建二叉树

剑指offer:关于二叉树的汇总(c++)

JZ1.二维数组中的查找;JZ4. 重建二叉树;JZ7. 斐波那契数列;JZ.13 调整数组顺序使奇数位于偶数前;JZ19. 顺序打印矩阵