前序、中序建树和中序、后序建树

1020 Tree Traversals (25 分)
https://pintia.cn/problem-sets/994805342720868352/problems/994805485033603072
1086 Tree Traversals Again (25 分)
https://pintia.cn/problem-sets/994805342720868352/problems/994805380754817024


根据前序和中序遍历建树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
TreeNode *buildTree(vector &preorder, vector &inorder) {
    return create(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
}

TreeNode* create(vector& preorder, vector& inorder, int ps, int pe, int is, int ie){
    if(ps > pe){
        return nullptr;
    }
    TreeNode* node = new TreeNode(preorder[ps]);
    int pos;
    for(int i = is; i <= ie; i++){
        if(inorder[i] == node->val){
            pos = i;
            break;
        }
    }
    node->left = create(preorder, inorder, ps + 1, ps + pos - is, is, pos - 1);
    node->right = create(preorder, inorder, pe - ie + pos + 1, pe, pos + 1, ie);
    return node;
}

让我解释递归中的坐标。很简单,我们可以看到,按中序遍历分为两部分,[is,pos-1]和[pos+1,is]根据pos指向的根节点。第一部分包含pos - is个元素,第二部分包含ie- (pos +1)+1 = ie - pos个元素。 相应地,在前序遍历中,[ps+1,ps+pos - is]区间中的元素属于左子树,而[pe - (ie - pos)+1,pe]区间中的元素属于右子树。


根据中序和后序建树

 struct TreeNode {
     int val;
     TreeNode *left;
     TreeNode *right;
     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 };
 TreeNode* create(vector inorder, vector postorder, int ib, int ie, int pb, int pe) {
     if (pb > pe) {
         return nullptr;
     }

     TreeNode* node = new TreeNode(postorder[pe]);
     int pos;
     for (int i = ib; i <= ie; i++) {
         if (inorder[i] == node->val) {
             pos = i;
             break;
         }
     }
     node->left = create(inorder, postorder, ib, pos - 1, pb, pb + pos - ib - 1);
     node->right = create(inorder, postorder, pos + 1, ie, pe - ie + pos, pe - 1);

     return node;

 }

    TreeNode* buildTree(vector inorder, vector postorder) {
        return create(inorder, postorder, 0, inorder.size() - 1, 0, postorder.size() - 1);
    }

你可能感兴趣的:(前序、中序建树和中序、后序建树)