剑指offer刷题笔记

剑指offer 重建二叉树

#include<iostream>
#include<vector>
using namespace std;
struct ListNode
{
    int val;
    struct ListNode *left;
    struct ListNode *right;
    ListNode(int x):
        val(x),left(NULL),right(NULL){}
};
ListNode * recon(vector<int> pre, vector<int> vin)
{

    if(pre.empty() || vin.empty())
        return nullptr;

    //建立根节点,为前序遍历中的第一个元素
    ListNode *head = new ListNode(pre[0]);

    //在中序遍历中寻找子树的根结点
    int root;
    for(int i=0; i<pre.size(); i++)
    {
        if(vin[i] == pre[0])
        {
            root = i;
            break;
        }
    }

    //定义新的左子树的前序、中序序列
    vector<int> p,v;

    for(int i=0; i < root; i++)
    {
        p.push_back(pre[i+1]);
        v.push_back(vin[i]);
    }

    //定义新的右子树的前序、中序序列
    vector<int> pr,vr;
    for(int i= root+1; i<pre.size(); i++)
    {
        pr.push_back(pre[i]);
        vr.push_back(vin[i]);
    }

    //新建左子树、右子树节点
    head->left = recon(p,v);
    head->right = recon(pr,vr);

    //返回节点
    return  head;

}
void bianli(ListNode *p)
{
    if(p!=NULL) cout<<p->val;
    if(p->left!=NULL) bianli(p->left);
    if(p->right!=NULL) bianli(p->right);
}
int main()
{
    vector<int> pre = {1,2,4,7,3,5,6,8};
    vector<int> vin = {4,7,2,1,5,3,8,6};

    ListNode *p = recon(pre,vin);
    bianli(p);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值