一、题目
二、代码
/**
* 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
{
//递归核心
//变量及大框架
//具体而言: 1.参数及返回值 2.终止条件 3.处理逻辑
public:
TreeNode* traversal(vector<int>& inorder, vector<int>& postorder)
{
// //后序遍历的最后一个节点 就是分割点
// int root_value=postorder[postorder.size()-1];
// TreeNode* root=new TreeNode(root_value);
// if(inorder.size()==1) return root; //叶子节点的处理
int i,j;
int find_index;
TreeNode* root;
vector<int> left_inorder;
vector<int> left_postorder;
vector<int> right_inorder;
vector<int> right_postorder;
vector<int>::iterator it;
if(inorder.size()==0) return nullptr;
else
{
//取后序遍历的最后一个值 作为切割值
root=new TreeNode(postorder[postorder.size()-1]);
// resize(postorder.size()-1); //截断尾部
if(inorder.size()==1) return root; //返回部分的核心
for(i=0;i<inorder.size();i++)
{
if(inorder[i]==root->val)
{
find_index=i;
break;
}
}
left_inorder.assign(inorder.begin(),inorder.begin()+find_index); //中间的分割值是不需要的
right_inorder.assign(inorder.begin()+find_index+1,inorder.end());
left_postorder.assign(postorder.begin(),postorder.begin()+left_inorder.size());
right_postorder.assign(postorder.begin()+left_inorder.size(),postorder.end()-1);
}
root->left=traversal(left_inorder,left_postorder);
root->right=traversal(right_inorder,right_postorder);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder)
{
//前序遍历: 根左右
//中序遍历: 左根右
//后序遍历: 左右根
//核心:递归--切割 具体而言,将一个vector切割成左右序列 递归传入自己 vector中只有一个元素 此时将vector值取出 作为节点返回
// 构建树的过程 1.创建节点 2.建立连接
if(inorder.size()==0) return nullptr;
return traversal(inorder,postorder);
}
};