C++ 为什么我的函数(在二叉树上)会打印意外的结果?

C++ 为什么我的函数(在二叉树上)会打印意外的结果?,c++,function,binary-tree,C++,Function,Binary Tree,我想要一个make函数,它以一个二叉树t和两个整数a,b作为参数,并打印出a和b之间有多少个整数 这里的示例是一个二叉树,包含三个节点和数据: 10,15,20. 例如,我调用这个函数:介于(t,10,20)之间,因此我期望数字为1,但这不会发生。。 我的职能是: ` int between (tree t, int a, int b) { if (t== NULL) return 0; if ((t->data >a ) &&

我想要一个make函数,它以一个二叉树t和两个整数a,b作为参数,并打印出a和b之间有多少个整数

这里的示例是一个二叉树,包含三个节点和数据: 10,15,20. 例如,我调用这个函数:介于(t,10,20)之间,因此我期望数字为1,但这不会发生。。 我的职能是:

   `
int between (tree t, int a, int b) {
    if (t== NULL) 
       return 0;
    if ((t->data >a ) && ( t->data <b))
       return 1 + between(t->left,a,b) + between(t->right,a,b);
}
`
int-between(树t,int-a,int-b){
如果(t==NULL)
返回0;
如果((t->data>a)&(t->data left,a,b)+介于(t->right,a,b)之间;
}

有人能解释一下吗?

首先,如果数字不在a和b之间,您没有定义返回值,这是一个错误,除了您的程序没有执行要求的操作,但是函数没有返回
int

其次,当值不在您的范围内时,您应该继续。 您的函数应该如下所示:

int between (tree t, int a, int b) {
    if (t== NULL) 
       return 0;
    if ((t->data >a ) && ( t->data <b))
       return 1 + between(t->left,a,b) + between(t->right,a,b);
    else return between(t->left,a,b) + between(t->right,a,b);

}
int-between(树t,int-a,int-b){
如果(t==NULL)
返回0;
如果((t->data>a)&(t->data left,a,b)+介于(t->right,a,b)之间;
否则返回(t->left,a,b)+(t->right,a,b)之间;
}
更好的是,如果左侧的值低于右侧的值(搜索树),则可以进行改进

int between (tree t, int a, int b) {
    if (t== NULL) 
       return 0;
    if ((t->data >a ) && ( t->data <b))
       return 1 + between(t->left,a,b) + between(t->right,a,b);
    else if(t->data<a) 
         return between(t->right,a,b);
    else if(t->data>b)
         return between(t->left,a,b);
}
int-between(树t,int-a,int-b){
如果(t==NULL)
返回0;
如果((t->data>a)&(t->data left,a,b)+介于(t->right,a,b)之间;
else if(t->dataright,a,b);
否则如果(t->data>b)
返回(t->左,a,b);
}

使用调试器逐行检查代码时,您观察到了什么?即使根不在范围内,子树中也可能存在在范围内的数字。例如,在您的示例中,您可能有一个不平衡的树,根10,右边15,右边20。在这种情况下,您的代码甚至不会向下看树。此外,您的程序可能会通过到达
void
函数的结尾而显示未定义的行为,而不会遇到
return
语句。当这两个条件都不成立时,您不会返回任何内容。您的二叉树是否有序(排序)有什么办法吗?我看课文中没有提到。