题解 | #从中序与后序遍历序列构造二叉树#

从中序与后序遍历序列构造二叉树

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++#
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务