题解 | #从中序与后序遍历序列构造二叉树#
从中序与后序遍历序列构造二叉树
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++#