我正在尝试从以下位置构建二叉树:
•预订单:A B C D E F G H I J K L M
•顺序:C E D F B A H J I K G M L
我几乎可以肯定树的左半部分是正确的,但右半部分似乎并不正确。
有人知道我的问题在哪里吗?
我知道预订单是父母,左,右
顺序是左,父,右
我需要做什么来确保这棵树是正确的?
algorithm - 从有序和预序重建二叉树-LMLPHP

最佳答案

您可以将以下算法应用于您的按序和按序遍历。生成的树将始终有效且唯一。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

TreeNode *treeBuilder(vector<int> &preorder, vector<int> &inorder, int start, int end, int indx) {
    if(start > end) return nullptr;

    TreeNode *root = new TreeNode(preorder[indx]);
    int rootPosition;
    for(int i = start; i <= end; ++i) {
        if(inorder[i] == root->val) {
            rootPosition = i;
            break;
        }
    }
    root->left = treeBuilder(preorder, inorder, start, rootPosition - 1, indx + 1);
    root->right = treeBuilder(preorder, inorder, rootPosition + 1, end, indx + 1 + rootPosition - start);
    return root;
}

TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
    if(preorder.size() == 0) return nullptr;
    return treeBuilder(preorder, inorder, 0, inorder.size() - 1, 0);
}

如果你觉得难以理解,我会加上解释。
编辑
应用上面提到的算法对给定的有序和预序序列,得到的树如下所示-
algorithm - 从有序和预序重建二叉树-LMLPHP

10-08 19:37