我正在尝试构建一个完整的二叉树(完全意味着每个非叶节点都有两个叶节点连接到它,即node->right
和node->left
是!= NULL
)只给定树的后序遍历。另外,给出后序遍历中的节点是否为叶节点。给定的后序遍历如下所示:
2(1.000000e+00)
3(1.000000e+00)
(1.000000e+00 1.000000e+00)
1(1.000000e+00)
(1.000000e+00 2.000000e+00)
例如,格式中的一行"%d(%le)"
是叶节点并且"(%le %le)"
是非叶节点。通常你不能只使用后序来构建树,因为连接会有多种可能性,但我确信能够区分叶子节点和非叶子节点在某种程度上很重要。我当前的功能如下所示:
Node *constructTreeHelper(FILE *infile, int *index) {
// Base case
if (*index <= 0) {
return NULL;
}
Node *root = NULL;
// Check for the "(" character
int check;
check = getc(infile);
fseek(infile, -1, SEEK_CUR);
// If the node is not a leaf node
if (check == 40) {
double lwire, rwire;
fscanf(infile, "(%le %le)\n", &lwire, &rwire);
root = createNode(0, 0, lwire, rwire);
*index = *index - 1;
if (*index >= 0) {
root->right = constructTreeHelper(infile, index);
root->left = constructTreeHelper(infile, index);
}
} else {
// If the node is a leaf node
int sink;
double cap;
fscanf(infile, "%d(%le)\n", &sink, &cap);
root = createNode(sink, cap, 0, 0);
*index = *index - 1;
if (*index >= 0) {
root->right = constructTreeHelper(infile, index);
root->left = constructTreeHelper(infile, index);
}
}
return root;
}
其中index
等于树中的节点数 - 1。显然,此实现仅在右侧构建节点。如何更新它以正确构建树?
编辑:让我添加一些关于我所知道的更多信息。所以,第一个节点总是必须是叶节点,最后一个节点总是必须是根节点。由于这不是二叉搜索树,而是简单的二叉树,因此您不能每次都使用更新的范围参数递归调用该函数。我的实现应该在 O(n) 时间内解决它,但我只是不知道如何在构建树时利用节点是否为叶节点的知识。