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

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<int> &preorder, vector<int> &inorder) {
    return create(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
}

TreeNode* create(vector<int>& preorder, vector<int>& 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<int> inorder, vector<int> 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<int> inorder, vector<int> postorder) {
        return create(inorder, postorder, 0, inorder.size() - 1, 0, postorder.size() - 1);
    }

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容