二叉树 - 打印叶子到叶子的路径[C]

时间:2013-05-30 17:12:50

标签: c binary-tree binary-search-tree

我正在尝试做作业,但我遇到了一些困难。

  

创建一个递归函数,在一个整数二叉树中打印一个叶子到另一个叶子之间的路径(即该树包含整数)。

     

int printPath(Tree * t,int a,int b)。

     

注意:您必须处理以下情况:

     
      
  • 树中没有a和/或b。若然,则返回-1。

  •   
  • 如果有,则打印值为a的节点与值为b的节点之间的所有值。返回0。

  •   

我试过这段代码:

int print1(Tree* tree, int a, int b) {
    int cnt;
    int c = MAX(a, b), d = MIN(a, b);
    a = d;
    b = c;
    if (!tree)
        return -1;
    /*
     if (tree->key.id > b || tree->key.id < a) {
         if(tree->key.id > b)
             cnt = print(tree->left, a, b);
         else
             cnt = print(tree->right, a, b);
     }*/

    if (tree->key.id == a || tree->key.id == b) {
        if (tree->key.HWGrade) {
            printf("e) , %d -> ", tree->key.id);
            tree->key.HWGrade = 0;
        }
        return 0;
    }

    if (tree->key.id > b) {
        cnt = print1(tree->left, a, b);
        if (tree->key.HWGrade) {
            printf("c) , %d -> ", tree->key.id);
            tree->key.HWGrade = 0;
        } else
            return 0;
    } else {
        if (tree->key.id > a) {
            cnt = print1(tree->left, a, b);
            if (tree->key.id != a && tree->key.id != b && !cnt) {

                if (tree->key.HWGrade) {
                    printf("d) , %d -> ", tree->key.id);
                    tree->key.HWGrade = 0;
                } else
                    return 0;
            }
        }
    }

    if (tree->key.id < a) {
        cnt = print1(tree->right, a, b);
        if (tree->key.id != a && tree->key.id != b && !cnt) {
            if (tree->key.HWGrade) {
                printf("a) , %d -> ", tree->key.id);
                tree->key.HWGrade = 0;
            } else
                return 0;
        }
    } else {
        if (tree->key.id < b) {
            cnt = print1(tree->right, a, b);
            if (tree->key.id != a && tree->key.id != b && !cnt) {
                if (tree->key.HWGrade) {
                    printf("b) , %d -> ", tree->key.id);
                    tree->key.HWGrade = 0;
                } else
                    return 0;
            }
        }
    }

    if (cnt == 0)
        return 0;
    return -1;
}

但它似乎不起作用。

结构使用者:

typedef struct {
    int id;
    int HWGrade;
    int ExamGrade;
} MatamStudent;

typedef struct Tree{
    int Data;
    struct Link* list;
    MatamStudent key;
    struct Tree *left;
    struct Tree *right;
} Tree;

我在Ubuntu下使用GCC和Eclipse。

2 个答案:

答案 0 :(得分:1)

我没有看到你的数组在哪里说你的树必须被排序。一个直观的算法可能是:

  • 搜索a并在p1(大小为n)中保存从根到此节点的路径。
  • 搜索b并在p2(大小为m)中保存从根到此节点的路径。
  • 比较两条路径。当两个值p1[i]p2[i]不同时,您可以p1p1[m]p1[i],第二条路径从p2[i]到{ {1}}。

该算法在p[m]中运行,其中O(S)是叶数。

S

答案 1 :(得分:0)

在平衡树中搜索节点的方式将与插入节点的方式相对应;如果你有一个递归函数来插入一个新值,那么你已经有了代码来找到它:)

这是一个寻找的例子;导出打印路径的代码留给学生练习:)

注意事项

每片叶子中有四种可能性: 1)叶子是你正在寻找的叶子 2)左边的叶子的id低于你要搜索的叶子,钥匙将是那片叶子的一个孩子 3)右边的叶子的id大于你要搜索的叶子 4)没有叶子,价值不存在。

您的代码比需要的复杂得多。树结构可以具有任意属性集,但它必须具有根leef。叶子结构只需要3个属性(它可以有更多,但不必有):它需要2个(对于二叉树)指向子节点的指针,它需要一个键。如果你有比这更多的数据,你就会比这更难。这是一个有趣的挑战 - 添加打印代码而不修改搜索代码;分离关注点,编程面包和黄油:)

Node* find_child(Node* parent, int id)
{
    if (parent->id == id)
        return parent;
    else if (parent->left.id < id)
        return find_child(parent->left, id);
    else if(parent->right.id < id)
        return find_child(parent->right, id)
    else
        return NULL;
}
祝你好运,我希望这会有所帮助。 :)