【LeetCode】剑指 Offer 07. 重建二叉树 LCOF(C++)


题目来源:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
在这里插入图片描述

题目大意

  • 递归与分治,将全局问题分解为局部的子问题,通过解决子问题来合并整体问题
  • 递归终止条件为递归时两个参数有一个为空时

递归

class Solution {
    
    
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
    
    
        if(preorder.empty() || inorder.empty())
            return nullptr;
        TreeNode* head = new TreeNode(preorder[0]);

        int root = 0;
        for(int i = 0 ; i < preorder.size(); ++i){
    
    
            // 维护 preorder[0] 为 容器首部元素
            if(inorder[i] == preorder[0]){
    
    
                root = i;
                break;
            }
        }
        vector<int> newLeftPre, newLeftIn;
        vector<int> newRightPre, newRightIn;
        for(int i = 0 ; i < root ; ++i){
    
    
            // 写为preorder[i],会导致第一次分治添加preorder[0]
            // 则在下次递归时preorder[0]还是根节点
            newLeftPre.push_back(preorder[i + 1]);
            newLeftIn.push_back(inorder[i]);
        }
        for(int i = root + 1; i < preorder.size(); ++i){
    
    
            newRightPre.push_back(preorder[i]);
            newRightIn.push_back(inorder[i]);
        }
        head->left = buildTree(newLeftPre, newLeftIn);
        head->right = buildTree(newRightPre, newRightIn);
        return head;
    }
};

复杂度分析

  • 时间复杂度:O(n)。n为数组的长度
  • 空间复杂度:O(n)。递归栈所用空间为O(n)

猜你喜欢

转载自blog.csdn.net/lr_shadow/article/details/114888695