构造数组的MaxTree

#include <iostream>
#include <vector>
#include <stack>
#include <map>
using namespace std;
struct Node
{
    int value;
    Node* left;
    Node* right;
    Node(int data)
    {
        value = data;
        left = nullptr;
        right = nullptr;
    }
};

void popStack(stack<Node*>& nStack, map<Node*, Node*>& nMap)
{
    Node* p = nStack.top();
    nStack.pop();
    if(nStack.empty())
    {
        nMap[p] = nullptr;
    }
    else {
        nMap[p] = nStack.top();
    }
    return;
}


Node* getMaxTree(vector<int>& arr)
{
    vector<Node*> nArr;
    for(int i = 0; i < arr.size(); ++i)
    {
        Node* p = new Node(arr[i]);
        nArr.push_back(p);
    }

    stack<Node*> nStack;
    map<Node*, Node*> lBigmap;
    map<Node*, Node*> rBigmap;
    for(int i = 0; i != arr.size(); ++i)
    {
        Node* curNode = nArr[i];
        while(!nStack.empty() && nStack.top()->value < curNode->value)
            popStack(nStack, lBigmap);
        nStack.push(curNode);
    }

    while(!nStack.empty())
    {
         popStack(nStack, lBigmap);
    }

    for(int i = arr.size() - 1; i != -1; --i)
    {
        Node* curNode = nArr[i];
        while(!nStack.empty() && nStack.top()->value < curNode->value)
            popStack(nStack, rBigmap);
        nStack.push(curNode);
    }
    while(!nStack.empty())
    {
         popStack(nStack, rBigmap);
    }
    Node* head = nullptr;

    for(int i = 0; i != arr.size(); ++i)
    {
        Node* currNode = nArr[i];
        Node* nleft = lBigmap[currNode];
        Node* nright = rBigmap[currNode];
        if(nleft == nullptr && nright == nullptr)
            head = currNode;
        else if(nleft == nullptr)
        {
            if(nright->left == nullptr)
                nright->left = currNode;
            else
                nright->right = currNode;
        }
        else if(nright == nullptr)
        {
            if(nleft->left == nullptr)
                nleft->left = currNode;
            else
                nleft->right = currNode;
        }
        else
        {
            Node* parrent = nleft->value < nright->value ? nleft : nright;
            if(parrent->left == nullptr)
                parrent->left = currNode;
            else
                parrent->right = currNode;
        }
    }
    cout << "head is " << head->value << endl;
    return head;
}
void Print(Node* head)
{
    if(head == nullptr)
        return;
    cout << "node is : " << head->value << endl;
    Print(head->left);
    Print(head->right);
    return;
}
int main()
{
    vector<int> arr;
    arr.push_back(3);
    arr.push_back(4);
    arr.push_back(5);
    arr.push_back(1);
    arr.push_back(2);
    Node* head = getMaxTree(arr);
    cout << "=======================" << endl;
    Print(head);
}

猜你喜欢

转载自blog.csdn.net/wzc2608/article/details/80624883