当前位置: 首页 > 知识库问答 >
问题:

构造只给出后序的全二叉树?

臧亦
2023-03-14
2(1.000000e+00)
3(1.000000e+00)
(1.000000e+00 1.000000e+00)
1(1.000000e+00)
(1.000000e+00 2.000000e+00)
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;
} 

共有1个答案

鄂育
2023-03-14

您的代码中存在一些问题:

>

  • 您应该使用ungetc()而不是fseek()返回一个字符,以避免不支持查找的流出现故障。

    您应该编写(check=='('),而不是硬编码ASCII字符值,这样既可移植又更易读。

    当您解析叶节点时,您不应该递归和解析当前节点下面的更多节点。

    index似乎是多余的,因为节点序列应该足以完全确定停止的位置。

    下面是一个修改版本:

    Node *constructTreeHelper(FILE *infile, int *index) { 
        double lwire, rwire;
        int sink;
        double cap;
        Node *node;
    
        // Base case 
        if (*index <= 0) {
            // This test seems redundant with the file contents */
            return NULL; 
        }
    
        // this fscanf will fail on the byte byte if it is not a '('
        if (fscanf(infile, " (%le %le)", &lwire, &rwire) == 2) {
           // If the node is not a leaf node
            node = createNode(0, 0, lwire, rwire);
            *index -= 1;
            node->right = constructTreeHelper(infile, index); 
            node->left = constructTreeHelper(infile, index); 
        } else if (fscanf(infile, "%d(%le)\n", &sink, &cap) == 2) {
            // If the node is a leaf node
            node = createNode(sink, cap, 0, 0);
            *index -= 1;
        } else {
            // invalid format or end of file */
            node = NULL;
        }
        return node;
    } 
    

  •  类似资料:
    • 如果只给出信息是后序遍历,如何构建二叉树。在谷歌上搜索了主题后,我明白在这种情况下不可能有唯一的构造二叉树。但是如果给定整数,则很容易根据小于或大于属性创建BT。但是,如果我们有字母表,那么我无法弄清楚我们根据什么制作父节点的左节点或右节点。这是我试图解决的问题. Q) 二叉树的后序遍历是DEBFCA。找出前序遍历吗? 选项: (A)ABFCDE 正确答案是:C 有人能解释一下我们如何回答吗? 我

    • 问题内容: 我正在构造一个二叉树。让我知道这是否是正确的方法。如果没有,请告诉我怎么做?我在构建通用二进制树的代码已找到的地方找不到合适的链接。BST的每个地方都已编码。 这是我要制作的二叉树。我应该能够进行所有的树遍历。 问题答案: 我认为这是您要寻找的:

    • 我们可以使用前序遍历输出构造唯一的二叉查找树,如下所示: 第一个元素将是根。 左子元素=小于根的最近元素。 右子元素=最近的元素大于根。 这些事实很容易转换成代码。然而,我正在努力获得如此严格的事实/步骤,以将级别顺序遍历输出转换为唯一的二叉查找树。 例如,如果我有以下级别顺序遍历输出,我可以形成BST如下: 级别顺序遍历中的第一个元素始终是根(级别0)。然后是级别1的元素。4小于5,所以我将把它

    • 从顺序和后序遍历迭代构造二叉树。 我已经了解了如何使用递归,但我正在寻找一个迭代构造二叉树的答案。 我为inorder和preorder编写了一个算法,但我想知道如何修改inorder和postorder的算法? 注意:它是伪代码,“=”意味着“==” 节点: 二叉树: 子算法树(前序、有序) pre:preorder:Int[],inoorder:Int[] 末端子算法 编辑:我找到了答案

    • 我正在研究一个算法问题。给定n,生成存储值1的所有结构唯一的二进制搜索树。。。n、 解决方案是枚举序列中的每个数字i,并使用该数字作为根,其左侧的子序列1…(i-1)将位于根的左分支上,类似地,右侧的子序列(i 1)…n位于根的右分支上。然后从子序列递归地构造子树。这种方法确保构建的BST都是唯一的,因为它们有唯一的根。 现在我的问题是:如果树不限于二叉搜索树,如果它可以是任何二叉树,该怎么办。解

    • 本文向大家介绍算法题,给前序和中序,求出二叉树相关面试题,主要包含被问及算法题,给前序和中序,求出二叉树时的应答技巧和注意事项,需要的朋友参考一下 参考回答: