力扣:105.从前序与中序遍历序列构造二叉树

力扣:105.从前序与中序遍历序列构造二叉树

代码随想录
递归思路:
通过先序和后序来构建二叉树。

先序遍历、找到中间节点,然后分为左树、右树、通过根节点递归构建。

代码随想录三步走
1:很明显没有思路,就按2的根、左子树、右子树。然后思考返回值就是节点。通过先序数组、后序数组来构造,可以直接用题目给定的函数形式。
2:此时很明显满足问题的情况不明确。此时就直接分为根的情况,左子树构建,右子树构建。
根的情况:根空、根为叶子
左子树构建:要知道左子树的中序数组和先序数组。
先序数组第一个即为根,通过根来将中序数组划分为左子树、中、右子树。此时就得到了左子树的中序数组,右子树的中序数组,中序数组我们都切成了左中序数组和右中序数组了,那么先序数组就可以按照左子树中序数组的大小来切割,切成左先序数组和右先序数组。
通过以上就可以完成左子树的中序数组和先续数组,右子树的中序数组和先序数组。

代码:

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(inorder.size() == 0) return nullptr;
        int a = preorder[0];
        TreeNode* node = new TreeNode(a);
        if(inorder.size() == 1) return node;
        
        int i;
        for(i = 0; i < inorder.size(); i++){
            if(inorder[i] == a) break;
        }
        preorder.erase(preorder.begin());
        vector<int>leftinorder(inorder.begin(), inorder.begin()+i);
        vector<int>rightinorder(inorder.begin()+i+1, inorder.end());
        vector<int>leftpreorder(preorder.begin(), preorder.begin()+leftinorder.size());
        vector<int>rightpreorder(preorder.begin()+leftinorder.size(), preorder.end());
        node->left = buildTree(leftpreorder,leftinorder);
        node->right = buildTree(rightpreorder,rightinorder);
        return node;
    }
};

题106删除末尾元素是:
resize是设置大小,设置容量所以可以等同于删除末尾元素。

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

题105删除首元素是:
erase才是删除元素函数

 preorder.erase(preorder.begin());

题105 erase的使用:
删除迭代器位置处的单个字符, 并返回下个元素的迭代器

iterator erase(const_iterator position)

删除迭代器[first, last)区间的所有字符,返回一个指向被删除的最后一个元素的下一个字符的迭代器。

 iterator erase(const_iterator first, const_iterator last)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值