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

大城市里の小女人 提交于 2020-02-27 14:56:04

根据一棵树的中序遍历与后序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:

3
/ \
9 20
/ \
15 7

code:先中序中找到根后,可以根据根在中序中的位置划分左右子树的长度,根据中序中划分的左右子树的长度,在后序中划分左右子树,后序序列中:左、右、根。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
    TreeNode* buildTreeCore(vector<int>& in,int inStart,int inEnd,
                            vector<int>& post,int postStart,int postEnd)
    {
        if(inStart>inEnd||postStart>postEnd)
            return nullptr;
        
        TreeNode* root=new TreeNode(post[postEnd]);
        for(int i=inStart;i<=inEnd;++i)
        {
            if(in[i]==post[postEnd])
            {
                root->left=buildTreeCore(in,inStart,i-1,post,postStart,postStart+i-inStart-1);
                root->right=buildTreeCore(in,i+1,inEnd,post,postStart+i-inStart,postEnd-1);
            }
        }
        return root;
    }
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if(inorder.empty()||postorder.empty()||inorder.size()!=postorder.size())
            return nullptr;

        return buildTreeCore(inorder,0,inorder.size()-1,postorder,0,postorder.size()-1);
    }
};

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!