思路:
二叉树后序遍历和中序遍历 可以确定一个二叉树,如果是已知后序和前序遍历不可以确定二叉树,
提供的遍历元素中不能有重复元素
后序遍历的最后元素是二叉树根节点,通过中序遍历,确定根节点下左右子树,如果有重复元素,
就无法在中序遍历元素中确定左右子树了
后序遍历元素需要从最后元素,向前进行遍历,再根据中序,确定左右子树分布位置
/*
*@author: 赵秋然
*@date:2021年2月20日
*@description:中序与后序遍历序列构造二叉树
*/
#include<iostream>
#include<map>
using namespace std;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution
{
map<int, int> v;
public:
TreeNode *createTree(vector<int>& inorder, vector<int>& postorder, int is, int ie, int ps, int pe)
{
if (is > ie)
{
return NULL;
}
int mid = v[postorder[pe]];
int cha = mid - is;
TreeNode *root = new TreeNode(postorder[pe]);
root->left = createTree(inorder, postorder, is, mid - 1, ps, ps + cha - 1);
root->right = createTree(inorder, postorder, mid + 1, ie, ps + cha, pe - 1);
return root;
}
TreeNode *buildTree(vector<int>& inorder, vector<int>& postorder)
{
if (inorder.empty() || postorder.empty())
{
return NULL;
}
int i = 0, n = inorder.size() - 1;
for (i = 0; i <= n; ++i)
{
v[inorder[i]] = i;
}
return createTree(inorder, postorder, 0, n, 0, n);
}
};
如果是中序和前序遍历,那么就从前序遍历起始进行加1操作,代码同理一致