剑指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;
}

你可能感兴趣的:(剑指offer刷题笔记)