none
二叉树程序运行,只能输出一个 RRS feed

  • 问题

  •  #include<stdio.h>
    #include<stdlib.h>

    struct BitNode {
    int data;
    struct BitNode *lchild, *rchild, *parent;
    };


    struct BitNode  *FindNode(struct BitNode *node, int x) {
    BitNode *p = NULL, *q = NULL;
    if (node == NULL) return node;
    if (node->data == x) return node;
    else {
    p = FindNode(node->lchild, x);
    if (p != NULL) {
    if (p->data == x) return p;
    }
    q = FindNode(node->rchild, x);
    return q;
    }
    }
    int x[20] = { 0 };//用于储存要找双亲节点的数据
    int y[10] = { 0 };
    int z[10] = { 0 };
    struct BitNode **CreateTree(const char *strFile) {
    struct BitNode *head[10];//十个树的头节点存放的位置

    for (int k = 0; k < 10; k++) {
    head[k] = (BitNode*)malloc(sizeof(struct BitNode));
    head[k]->data = 0;
    head[k]->lchild = NULL;
    head[k]->rchild = NULL;
    }
    FILE *fp = NULL;
    errno_t err = fopen_s(&fp, strFile, "r");
    if (fp == NULL) {
    printf("Error:can not open file %s\n", strFile);
    return NULL;
    }
    int n=0;
    fscanf_s(fp, "%d", &n);
    for (int i = 0; i < 2*n; i=i+2) {
    int V, E, number1, number2;
    fscanf_s(fp, "%d %d %d %d", &V, &E, &number1, &number2);
    x[i] = number1, x[i + 1] = number2;
    int *numbers;
    numbers = (int *)malloc(2*E * sizeof(int));
    for (int u = 0; u < 2*E; u=u+2) {
    fscanf_s(fp, "%d %d",& numbers[u], &numbers[u + 1]);
    }
    int a=numbers[0], b=numbers[1];
    head[i/2]->data=a;
    struct BitNode *t;
    t= (BitNode*)malloc(sizeof(struct BitNode));
    t->data = b;
    t->lchild = NULL;
    t->rchild = NULL;
    t->parent = head[i/2];
    head[i/2]->lchild = t;
    int j = 2;
    for (j; j < 2*E; j=j+2){
    int c, d;
    c = numbers[j], d = numbers[j + 1];
    if (FindNode(head[i/2], c)) {
    struct BitNode *q,*r;
    r = FindNode(head[i/2], c);
    q=(BitNode*)malloc(sizeof(struct BitNode));
    q->lchild = NULL;
    q->rchild = NULL;
    q->data = d;
    q->parent = r;
    if (r->lchild != NULL) r->rchild = q;
    else r->lchild = q;
    }
    else if (FindNode(head[i / 2], d)) {
    struct BitNode  *r;
    r = FindNode(head[i / 2], d);
    head[i / 2] = (BitNode*)malloc(sizeof(struct BitNode));
    head[i / 2]->data = c;
    head[i / 2]->lchild = r;
    head[i / 2]->rchild = NULL;
    r->parent = head[i / 2];

    }
    else if (FindNode(head[i / 2], d) == NULL&&FindNode(head[i / 2], c) == NULL) {
    int middle1=numbers[j], middle2 = numbers[j + 1];
    for (int v = j; v < 2*E-2; v = v + 2) {
    numbers[v] = numbers[v + 2];
    numbers[v + 1] = numbers[v + 3];
    }
    numbers[2 * E - 2] = middle1, numbers[2 * E - 1] = middle2;
    j = j - 2;
    }//如果两个数都没有,则暂时不考虑,放到数组最后
    }
    }
    fclose(fp);
    return head;
    }


    BitNode *FindAncestor(struct BitNode *node, int x1, int x2) {
    struct BitNode* p1, *p2;
    p1 = FindNode(node, x1);
    p2 = FindNode(node, x2);
    struct BitNode *pa = p1->parent, *pb = p2->parent;
    for (; pb != node->parent; pb = pb->parent) {
    for (pa = p1->parent; pa != node->parent; pa = pa->parent) {
    if (pb->data == pa->data) return pb;
    }
    }
    }

    int GetNodeCount(BitNode *root){
    if (root == NULL)
    return 0;

    int LeftNum = GetNodeCount(root->lchild);
    int RightNum = GetNodeCount(root->rchild);
    int Num = LeftNum + RightNum + 1;
    return Num;

    }

    void main() {
    const char *a = "E:\\123.txt";
        struct BitNode **root;
    root=CreateTree(a);


        BitNode *s1 = FindAncestor(root[0], x[0], x[1]);
    y[0] = s1->data;
    z[0] = GetNodeCount(s1); 
    BitNode *s2 = FindAncestor(root[1], x[2], x[3]);
    y[1] = s2->data;
    z[1] = GetNodeCount(s2);
    /*BitNode *s3 = FindAncestor(root[2], x[4], x[5]);
    y[2] = s3->data;
    z[2] = GetNodeCount(s3);
    BitNode *s4 = FindAncestor(root[3], x[6], x[7]);
    y[3] = s4->data;
    z[3] = GetNodeCount(s4);
    BitNode *s5 = FindAncestor(root[4], x[8], x[9]);
    y[4] = s5->data;
    z[4] = GetNodeCount(s5);
    BitNode *s6 = FindAncestor(root[5], x[10], x[11]);
    y[5] = s6->data;
    z[5] = GetNodeCount(s6);
    BitNode *s7 = FindAncestor(root[6], x[12], x[13]);
    y[6] = s7->data;
    z[6] = GetNodeCount(s7);
    BitNode *s8 = FindAncestor(root[7], x[14], x[15]);
    y[7] = s8->data;
    z[7] = GetNodeCount(s8);
    BitNode *s9 = FindAncestor(root[8], x[16], x[17]);
    y[8] = s9->data;
    z[8] = GetNodeCount(s9);
    BitNode *s10 = FindAncestor(root[9], x[18], x[19]);
    y[9] = s10->data;
    z[9] = GetNodeCount(s10);*/
    //这里十分奇怪,始终每次只能输出其中的某一个,在一起就不行,而每一个数据都是对的
    FILE *fp = NULL;
    errno_t err = fopen_s(&fp, "E:\\output.txt", "w");
    for (int k = 0; k < 10; k++) {
    fprintf(fp, "#%d %d\n", y[k], z[k]);
    fclose(fp);
    }
    2018年6月4日 13:27

全部回复

  • Hi,

    感谢在MSDN论坛发贴。

    >>二叉树程序运行,只能输出一个

    请提供一下你的二叉树的具体数据信息。另外,你指的在一起就不行是什么意思,请详细说明。

    我这边无法重现你的问题,请提供具体的测试数据,例如123.txt文件,方便我们重现问题,查找具体原因。

    Best Regards,

    Baron Bi


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年6月5日 6:04
  • 您好!已发到您邮箱,谢谢!
    2018年6月5日 7:42
  • 麻烦共享到OneDrive上。谢谢你的理解与支持。

    Best Regards,

    Baron Bi


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年6月5日 8:10
  • 已经上传共享了链接地址是https://1drv.ms/t/s!Aoaq5i1PSze1aC7Ffm4f5ipu2-4,谢谢
    2018年6月5日 8:38
  • 您好,“在一起无法运行”指的是代码中BitNode *s1,*s2……等储存的数据诸如data,节点个数不能够同时输出。而如果加了注释,只运行一个BitNode *s1,则可以输出正确的data和节点个数,事实上*s2到*s10中的数据也是可以单独输出的。期待您的解答!
    2018年6月5日 14:45
  • >>您好,“在一起无法运行”指的是代码中BitNode *s1,*s2……等储存的数据诸如data,节点个数不能够同时输出。而如果加了注释,只运行一个BitNode *s1,则可以输出正确的data和节点个数,事实上*s2到*s10中的数据也是可以单独输出的。期待您的解答!

    经过测试发现,你每次运行FindAncestor函数过后,你的root数组的地址会发生变化。

    导致你第二次读取数据的时候会出现错误。

    Best Regards,

    Baron Bi


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年6月7日 8:33