考察树的建立,以及树的遍历
#include<vector>
#include<iostream>
#include<map>
#include<queue>
typedef struct Node
{
int value;
Node* left;
Node* right;
Node(Node* _left = NULL, Node* _right = NULL, int _value = -1)
:left(_left),right(_right),value(_value){};
};
std::map<int, int> postMap;
std::map<int, int> inMap;
void ReleaseTree(Node* root)
{
if(root == NULL) return;
ReleaseTree(root->left);
ReleaseTree(root->right);
delete root;
}
int FindMaxIdxInPost(const std::vector<int>&inOrder, int s, int t)
{
int max = 0;
for(int i = s; i <= t; ++i)
{
if(max < postMap[inOrder[i]])
max = postMap[inOrder[i]];
}
return max;
}
void BuildTree(Node* &root, const std::vector<int>& postOrder, int p_s, int p_t,
const std::vector<int>& inOrder, int in_s, int in_t)
{
if(p_s > p_t || in_s > in_t)
{
root = NULL;
return;
}
root = new Node;
root->value = postOrder[p_t];
int inRootIdx = inMap[root->value];
if(inRootIdx != in_s && inRootIdx != in_t)//has left tree & right tree
{
int p_maxIdx = FindMaxIdxInPost(inOrder, in_s, inRootIdx-1);
BuildTree(root->left, postOrder, p_s, p_maxIdx, inOrder, in_s, inRootIdx-1);
BuildTree(root->right, postOrder, p_maxIdx+1, p_t-1, inOrder, inRootIdx+1, in_t);
}
else if(inRootIdx != in_s && inRootIdx == in_t)//only left tree
{
BuildTree(root->left, postOrder, p_s, p_t-1, inOrder, in_s, in_t-1);
}
else if(inRootIdx == in_s && inRootIdx != in_t)//only right tree
{
BuildTree(root->right, postOrder, p_s, p_t-1, inOrder, in_s+1, in_t);
}
}
void LevelTravel(Node* root)
{
std::queue<Node*> q;
if(root != NULL)
{
printf("%d", root->value);
q.push(root->left);
q.push(root->right);
}
else return;
while( !q.empty() )
{
Node* node = q.front();
q.pop();
if(node == NULL) continue;
printf(" %d", node->value);
q.push(node->left);
q.push(node->right);
}
printf("\n");
}
int main()
{
int n;
while( scanf("%d", &n) != EOF )
{
std::vector<int> postOrder(n), inOrder(n);
postMap.clear();
inMap.clear();
for(int i = 0; i < n; ++i)
{
scanf("%d", &postOrder[i]);
postMap[postOrder[i]] = i;
}
for(int i = 0; i < n; ++i)
{
scanf("%d", &inOrder[i]);
inMap[inOrder[i]] = i;
}
Node* tree;
BuildTree(tree, postOrder, 0, n-1, inOrder, 0, n-1);
LevelTravel(tree);
ReleaseTree(tree);
}
return 0;
}