day18 根据一棵树的中序遍历与后序遍历构造二叉树

第一步:如果数组大小为零的话,说明是空节点了

第二步:如果不为空,那么取后序数组最后一个元素作为节点元素,找到根节点

第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点

第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)

第五步:切割后序数组,切成后序左数组和后序右数组

第六步:递归处理左区间和右区间

 

    TreeNode* traversal (vector<int>& inorder, vector<int>& postorder) {

        if (postorder.size() == 0) return NULL;

 

        // 后序遍历数组最后一个元素,就是当前的中间节点

        int rootValue = postorder[postorder.size() - 1];

 

        TreeNode* root = new TreeNode(rootValue);

 

        // 叶子节点

        if (postorder.size() == 1) return root;

 

        // 找到中序遍历的切割点

        int delimiterIndex;

        for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++) {

            if (inorder[delimiterIndex] == rootValue) break;

        }

 

        // 切割中序数组

        // 左闭右开区间:[0, delimiterIndex)

中序遍历左区间

        vector<int> leftInorder(inorder.begin(), inorder.begin() + delimiterIndex);

        // [delimiterIndex + 1, end)

中序遍历右区间

        vector<int> rightInorder(inorder.begin() + delimiterIndex + 1, inorder.end() );

 

        // postorder 舍弃末尾元素

        postorder.resize(postorder.size() - 1);

 

        // 切割后序数组

        // 依然左闭右开,注意这里使用了左中序数组大小作为切割点

        // [0, leftInorder.size)

后序遍历左区间

        vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());

        // [leftInorder.size(), end)

后序遍历右区间

        vector<int> rightPostorder(postorder.begin() + leftInorder.size(), postorder.end());

 

        root->left = traversal(leftInorder, leftPostorder);

        root->right = traversal(rightInorder, rightPostorder);

        return root;

    }

public:

    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {

        if (inorder.size() == 0 || postorder.size() == 0) return NULL;

        return traversal(inorder, postorder);

    }

 

 

最近更新

  1. TCP协议是安全的吗?

    2023-12-19 18:56:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-19 18:56:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-19 18:56:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-19 18:56:02       20 阅读

热门阅读

  1. 硬件编程语言

    2023-12-19 18:56:02       46 阅读
  2. json-server详解

    2023-12-19 18:56:02       40 阅读
  3. 解决matplotlib中文显示乱码

    2023-12-19 18:56:02       45 阅读
  4. 面试题,手写soft_nms

    2023-12-19 18:56:02       44 阅读
  5. 音频筑基:瞬态、基音、偏噪信号类型分析

    2023-12-19 18:56:02       37 阅读
  6. 2312d,D语言单元测试等

    2023-12-19 18:56:02       51 阅读
  7. == 和 equals 的区别

    2023-12-19 18:56:02       37 阅读
  8. Postman中raw是什么

    2023-12-19 18:56:02       34 阅读
  9. ansible

    ansible

    2023-12-19 18:56:02      33 阅读
  10. Spring 框架中都用到了哪些设计模式?

    2023-12-19 18:56:02       50 阅读