106. 从中序与后序遍历序列构造二叉树


?做题思路or感想:

  • 这道题要从前中后序遍历的特点入手。因为后序遍历的最后一个节点必是根节点,故从次开始

    1. 如果数组长度为0,则说明是空节点
    2. 如果数组不为空,那么后序数组的最后一个元素作为节点元素
    3. 找到后序数组的最后一个元素在中序数组中的位置,作为切割位置
    4. 利用切割位置把中,后序数组切成左子树的中,后序数组和右子树的中,后序数组
    5. 递归左子树和右子树
  • class Solution {
    public:
        TreeNode* buildTree(vector& inorder, vector& postorder) {
            if (postorder.size() == 0)return nullptr;
            int val = postorder[postorder.size() - 1];
            TreeNode* root = new TreeNode(val);	//造节点
            if (postorder.size() == 1)return root;
            int index;
            //找切割点
            for (int i = 0; i < inorder.size(); i++) {
                if (inorder[i] == val) {
                    index = i;
                    break;
                }
            }
            //左子树的中序,后序遍历的数组
            vector inleft = vector(inorder.begin(), inorder.begin() + index);
            vector postleft = vector(postorder.begin(), postorder.begin() + index);
            //右子树的中序,后序遍历的数组
            vector inright = vector(inorder.begin() + index + 1, inorder.end());
            vector postright = vector(postorder.begin() + index, postorder.end() - 1);
            root->left = buildTree(inleft, postleft);
            root->right = buildTree(inright, postright);
            return root;
        }
    };