题解 | #从中序与后序遍历序列构造二叉树#
从中序与后序遍历序列构造二叉树
https://www.nowcoder.com/practice/ab8dde7f01f3440fbbb7993d2411a46b
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param inorder int整型vector 中序遍历序列
* @param postorder int整型vector 后序遍历序列
* @return TreeNode类
*/
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
// write code here
//返回条件
if(inorder.size()==0||postorder.size()==0)
return NULL;
//第一步:后续遍历最后一个数作为根节点的值
int root_val=postorder[postorder.size()-1];
TreeNode* root=new TreeNode(root_val);
//第二步:在中序中找到该值,该值左边是根节点左子树,右边是右子树,整体左中右
//第三步:将后续也分为左子树右子树和根节点,由于根节点左子树右子树节点数目固定,所以第二部和第三步分割点一致差一
int root_index=find(inorder.begin(),inorder.end(),root_val)-inorder.begin();
//第四步:取出左子树中序和后序,取出右子树中序和后序
vector<int> inorderleft(inorder.begin(),inorder.begin()+root_index);
vector<int> inorderright(inorder.begin()+root_index+1,inorder.end());
vector<int> postorderleft(postorder.begin(),postorder.begin()+root_index);
vector<int> postorderright(postorder.begin()+root_index,postorder.end()-1);
//最后根节点指向左右子树,返回根节点
root->left=buildTree(inorderleft, postorderleft);
root->right=buildTree(inorderright, postorderright);
return root;
}
};
#C/C++#
