#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);
}
构造数组的MaxTree
猜你喜欢
转载自blog.csdn.net/wzc2608/article/details/80624883
今日推荐
周排行