我正在尝试从以下位置构建二叉树:
•预订单: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
我几乎可以肯定树的左半部分是正确的,但右半部分似乎并不正确。
有人知道我的问题在哪里吗?
我知道预订单是父母,左,右
顺序是左,父,右
我需要做什么来确保这棵树是正确的?
最佳答案
您可以将以下算法应用于您的按序和按序遍历。生成的树将始终有效且唯一。
/**
* 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);
}
如果你觉得难以理解,我会加上解释。
编辑
应用上面提到的算法对给定的有序和预序序列,得到的树如下所示-