输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode* R(vector<int> a,int abegin,int aend,vector<int> b,int bbegin,int bend)
{
// 判断两个序列是否为空
if(abegin>=aend || bbegin>=bend)
return NULL;
TreeNode* root=new TreeNode(a[abegin]); // 某个子树的根
// 遍历中序序列,找到根节点所在的index,也就是pivot,同一个元素在两个序列中位序的差
int pivot;
for(pivot=bbegin;pivot<bend;pivot++)
if(b[pivot]==a[abegin])
break;
printf("pivot: %d\n", pivot);
// 递归结构
root->left=R(a, abegin+1, abegin+pivot-bbegin+1, b, bbegin, pivot);
root->right=R(a, abegin+pivot-bbegin+1, aend, b, pivot+1, bend);
return root;
}
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
return R(pre,0,pre.size(),vin,0,vin.size());
}
};
void print(int ch, int level)
{
// cout << ch << "在第" << level << "层" << endl;
printf("%d_%d\t", ch, level);
}
void PreOrder(TreeNode* T, int level) {
if(!T)
return;
print(T->val, level);
PreOrder(T->left, level + 1);
PreOrder(T->right, level + 1);
}
void InOrder(TreeNode* T, int level)
{
if(!T)
return;
InOrder(T->left, level + 1);
print(T->val, level);
InOrder(T->right, level + 1);
}
void PostOrder(TreeNode* T, int level)
{
if(!T)
return;
PostOrder(T->left, level + 1);
PostOrder(T->right, level + 1);
print(T->val, level);
}
int main() {
vector<int> pre;
int tmp[] = {1,2,4,7,3,5,6,8};
for(int i=0; i< sizeof(tmp)/ sizeof(int); i++)
pre.push_back(tmp[i]);
int tmp2[] = {4,7,2,1,5,3,8,6};
vector<int> vin;
for(int i=0; i< sizeof(tmp2)/ sizeof(int); i++)
vin.push_back(tmp2[i]);
Solution s;
TreeNode* pRoot = s.reConstructBinaryTree(pre, vin);
printf("PreOrder:\t\t");
PreOrder(pRoot, 1);
printf("\n");
printf("InOrder:\t\t");
InOrder(pRoot, 1);
printf("\n");
printf("PostOrder:\t\t");
PostOrder(pRoot, 1);
printf("\n");
return 0;
}