leetcode:构建二叉树

本文详细介绍了如何使用中序和后序遍历序列构建二叉树,包括递归方法和核心逻辑解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Construct Binary Tree from Inorder and Postorder Traversal

 

class Solution {

public:
    TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
        int len = postorder.size();
        TreeNode *node = buildTree(inorder.begin(),inorder.end(),postorder.begin(),postorder.end());
        return node;
    }
private:
    TreeNode *buildTree(vector<int>::iterator in_first,vector<int>::iterator in_last,vector<int>::iterator post_first,vector<int>::iterator post_last)
    {
        if(in_first == in_last)
            return NULL;
        if(post_first == post_last)
            return NULL;


        TreeNode *node = new TreeNode(*(post_last-1));
        vector<int>::iterator it = find(in_first,in_last,*(post_last-1));
        int leftSize = it - in_first;


        node->left = buildTree(in_first,it,post_first,post_first+leftSize);
        node->right = buildTree(it+1,in_last,post_first+leftSize,post_last-1);
        
        return node;
    }

};


Construct Binary Tree from Preorder and Inorder Traversal

 


class Solution {
public:
    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
        TreeNode* node = buildTree(preorder.begin(),preorder.end(),inorder.begin(),inorder.end());
        return node;
    }
//    template<typename InputIterator>
    TreeNode* buildTree(vector<int>::iterator pre_first, vector<int>::iterator pre_last,vector<int>::iterator in_first, vector<int>::iterator in_last)
    {
        if(pre_first == pre_last)
            return NULL;
        if(in_first == in_last)
            return NULL;


        TreeNode* node  = new TreeNode(*pre_first);
        vector<int>::iterator root = find(in_first,in_last,*pre_first);
        int leftSize = root - in_first;//distance(in_first,root);


        node->left = buildTree(pre_first+1,pre_first+leftSize+1,in_first,root);
        node->right = buildTree(pre_first+leftSize+1,pre_last,root+1,in_last);


        return node;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

morning_judger

您的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值