前序遍历和中序遍历还原二叉树
思想如下:
a、根据前序遍历结果,第一个元素为二叉树的根结点;
b、观察中序遍历结果,根结点左侧的为左子树,若左子树根结点前(后)再无任何元素,则左(右)子树的左分支为空;根结点右侧的为右子树,若右子树根结点前(后)再无任何元素,则左(右)子树的左分支为空;
c、上面的过程是递归的。先找到当前树的根结点,然后划分为左右子树,再进入左子树重复上面的过程,最后进入右子树重复上面的过程,最终还原一棵树。
1、前序遍历:GDAFEMHZ
中序遍历:ADEFGHMZ
求得后序遍历结果为:AEFDHZMG
2序遍历:ADCEFGHB
中序遍历:CDFEGHAB
求得后序遍历结果为:CFHGEDBA
中序遍历和后序遍历还原二叉树
思想如下:
a、根据后序遍历结果,最后一个元素为二叉树的根结点;
b、观察中序遍历结果,其中根结点左侧为左子树,若左子树根结点前(后)再无任何元素,则左(右)子树的左分支为空;其中根结点右侧为右子树,若右子树根结点前(后)再无任何元素,则左(右)子树的左分支为空;
c、上面的过程是递归的。先根据后序遍历结果找根结点,根结点左侧为左子树,右侧为右子树,再进入左子树重复上面的过程,最后进入右子树重复上面的过程,最终还原一棵树。
中序遍历:HDIBJEKALFMCNGO
后序遍历:HIDJKEBLMFNOGCA
前序遍历:ABDHIEJKCFLMGNO
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
int temp;
int flag = 0;
vector<int> preleft,vinleft;
vector<int> preright,vinright;
if(pre.empty() || vin.empty())
{
return NULL;
}
temp = pre[0];
TreeNode *root = new TreeNode(temp);
for(int j=0;j<vin.size();j++)
{
if(flag == 0)
{
if(vin[j] != temp)
{
vinleft.push_back(vin[j]);
preleft.push_back(pre[j+1]);
}
else
flag = 1;
}
else
{
vinright.push_back(vin[j]);
preright.push_back(pre[j]);
}
}
root->left = reConstructBinaryTree(preleft,vinleft);
root->right = reConstructBinaryTree(preright,vinright);
return root;
}