LeetCode106:从中序与后序遍历序列构造二叉树

题目描述
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

在这里插入图片描述

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

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

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

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

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

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

代码

class Solution {
public:
    TreeNode* traversal(vector<int>& inorder, vector<int>& postorder){
        //第一步
        if(postorder.size() == 0) return nullptr;
        
        //第二步 后序遍历数组最后一个元素,就是当前的中间节点
        int nodeVal = postorder[postorder.size() - 1];
        TreeNode* root = new TreeNode(nodeVal);

        if(postorder.size() == 1) return root;
        
        //第三部:找切割点
        int index;
        for(index = 0; index < inorder.size(); ++index){
            if(inorder[index ] == nodeVal)
                break;
        }

        //第四步:切割中序数组,得到中序做数组和中序右数组
        vector<int> leftInorder(inorder.begin(), inorder.begin() + index);
        //+1 是跳过分割点(已经构建的元素)
        vector<int> rightInorder(inorder.begin()+index + 1, inorder.end());

        // 第五步:切割后序数组,得到 后序左数组和后序右数组
        postorder.resize(postorder.size() - 1);
        vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());
        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) {
        return traversal(inorder, postorder);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值