#include "Tree.h"
using namespace std;
//先序加中序
Node* preIN(int* p, int pi, int pj, int* n, int ni, int nj,
map<int, int>& nMap)
{
if(pi > pj)
return nullptr;
Node* head = new Node(p[pi]);
int index = nMap[p[pi]];
head->left = preIN(p, pi + 1, pi + index - ni, n, ni, index - 1, nMap);
head->right = preIN(p, pi + index - ni + 1, pj, n, index + 1, nj, nMap);
}
Node* preInToTree(int* pre, int* in, int length)
{
if(pre == nullptr || in == nullptr || length < 1)
return nullptr;
map<int, int> nMap;
for(int i = 0; i < length; ++i)
nMap[in[i]] = i;
return preIN(pre, 0, length - 1, in, 0, length - 1, nMap);
}
//后序加中序
Node* inPos(int* n, int ni, int nj,
int* s, int si, int sj,
map<int, int>& nMap)
{
if(si > sj)
return nullptr;
Node* head = new Node(s[sj]);
int index = nMap[s[sj]];
head->left = inPos(n, ni, index - 1, s, si, si + index - ni - 1, nMap);
head->right = inPos(n, index + 1, nj, s, si + index - ni, sj - 1, nMap);
}
Node* inPosToTree(int* in, int* pos, int length)
{
if(in == nullptr || pos == nullptr || length < 1)
return nullptr;
map<int, int> nMap;
for(int i = 0; i < length; ++i)
nMap[in[i]] = i;
return inPos(in, 0, length - 1, pos, 0, length - 1, nMap);
}
//前序加后序
//并非所有的树都可以通过先序和后序数组的组合重建出来
//必须所有节点要么是叶子节点,要么左右子树都存在
Node* prePos(int* p, int pi, int pj,
int* s, int si, int sj,
map<int, int>& nMap)
{
Node* head = new Node(s[sj--]);
if(pi == pj)
return head;
int index = nMap[p[++pi]];
head->left = prePos(p, pi, pi + index - si, s, si, index, nMap);
head->right = prePos(p, pi + index - si + 1, pj, s, index + 1, sj, nMap);
return head;
}
Node* prePosToTree(int* pre, int* pos, int length)
{
if(pre == nullptr || pos == nullptr || length < 0)
return nullptr;
map<int, int> nMap;
for(int i = 0; i < length; ++i)
nMap[pos[i]] = i;
return prePos(pre, 0, length - 1, pos, 0, length - 1, nMap);
}
int main()
{
int pre[] = {0, 1, 3, 4, 2, 5, 6};
int in[] = {3, 1, 4, 0, 5, 2, 6};
int pos[] = {3, 4, 1, 5, 6, 2, 0};
Node* pNode0 = preInToTree(pre, in, 7);
Node* pNode1 = inPosToTree(in, pos, 7);
Node* pNode2 = prePosToTree(pre, pos, 7);
Print(pNode0);
cout << "=================================" << endl;
Print(pNode1);
cout << "=================================" << endl;
Print(pNode2);
cout << "=================================" << endl;
}
先序、中序、后序数组两两结合重构二叉树
猜你喜欢
转载自blog.csdn.net/wzc2608/article/details/80877031
今日推荐
周排行