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

原题链接:106. 从中序与后序遍历序列构造二叉树

通过后序找到树的根节点,然后再通过中序进行左右子树确认,切割
然后通过递归不断的进行寻找与切割,直到遇到叶子结点为止
注意切割的区间

全代码:

class Solution {
public:
    TreeNode* traversal (vector<int>& inorder, vector<int>& postorder) {
        //后序数组如果是0,那么就代表是空树 直接返回NULL
        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;

    }

    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if (inorder.size() == 0 || postorder.size() == 0) return NULL;
        return traversal(inorder, postorder);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值