我试图找到二进制树的最小值,但输出是地址

I tried to find min of binary tree but output is address

本文关键字:最小值 输出 地址 二进制      更新时间:2023-10-16

更新

谢谢你的回答。我想我知道这个错误是双重比较造成的。numeric_limits似乎在我的电脑上运行不好。我写了一个简单的函数来比较double,它很有效:

bool compareDouble(double a,double b)
{
if(a-b<-EPSILON) 
    return true;
else
    return false;
 }

================

我试着写一个简单的函数来在二叉树中查找min。函数可以很好地运行,但输出是8106336,它不是树中的值,但看起来像地址。我不明白为什么。

树定义如下,语言为c++

typedef struct myNode* LPNode;
typedef struct myNode Node;
struct myNode
{
  double key;
  LPNode Left; //left subtree
  LPNode Right; //right subtree
};

查找min的函数如下,min的首字母缩写为99999

double minValue(LPNode Root,double min) {
  if(Root == NULL)
    return min;
  if(Root->key < min)
    min = Root->key;
  min = minValue(Root->Left, min);
  min = minValue(Root->Right, min);
  return min;
}

所以,我必须显示双重类型的版本:

    #include <iostream>
    #include <limits>  

    typedef struct myNode* LPNode;
    typedef struct myNode Node;
    struct myNode
    {
        double key;
        LPNode Left; //left subtree
        LPNode Right; //right subtree
    };

    double minValue(LPNode Root,double min) {
        if(Root == NULL)
            return min;
        if(Root->key -  min < std::numeric_limits<double>::min())
            min = Root->key;
        min = minValue(Root->Left, min);
        min = minValue(Root->Right, min);
        return min;
   }
 int main(int argc, const char * argv[])
 {
    LPNode node1 = new Node;
    LPNode node2 = new Node;
    LPNode node3 = new Node;
    LPNode node4 = new Node;
    LPNode node5 = new Node;
    LPNode node6 = new Node;
    LPNode node7 = new Node;
    node1->key = 10.01;
    node2->key = 9.1;
    node3->key = 8.2;
    node4->key = 7.4;
    node5->key = 6.6;
    node6->key = 1.1;
    node7->key = 12.2;
    LPNode root = node1;
    node1->Left = node2;
    node2->Right = node3;
    node2->Left = node4;
    node3->Right  = node5;
    node3->Left = node7;
    node7->Right  = node6;
    double mymin = minValue(root, 99999);
    std::cout << mymin;
    delete node1;
    node1 = NULL;
    delete node2;
    node2 = NULL;
    delete node3;
    node3 = NULL;
    delete node4;
    node4 = NULL;
    delete node5;
    node5 = NULL;
    delete node6;
    node6 = NULL;
    delete node7;
    node7 = NULL;
    return 0;
}

首先,不能使用>或<或者==,我使用int重写如下:

    #include <iostream>
    typedef struct myNode* LPNode; 
    typedef struct myNode Node;
    struct myNode
    {
        int key;
        LPNode Left; //left subtree
        LPNode Right; //right subtree
    };

    int minValue(LPNode Root,int min) {
        if(Root == NULL)
            return min;
        if(Root->key < min)
            min = Root->key;
        min = minValue(Root->Left, min);
        min = minValue(Root->Right, min);
        return min;
    }
    int main(int argc, const char * argv[])
    {
        LPNode node1 = new Node;
        LPNode node2 = new Node;
        LPNode node3 = new Node;
        LPNode node4 = new Node;
        LPNode node5 = new Node;
        LPNode node6 = new Node;
        LPNode node7 = new Node;
        node1->key = 10;
        node2->key = 9;
        node3->key = 8;
        node4->key = 7;
        node5->key = 6;
        node6->key = 1;
        node7->key = 12;
        LPNode root = node1;
        node1->Left = node2;
        node2->Right = node3;
        node2->Left = node4;
        node3->Right  = node5;
        node3->Left = node7;
        node7->Right  = node6;
       int mymin = minValue(root, 9999);
       std::cout << mymin<< std::endl;
       //free node1 ... node7
       delete node1;
       node1 = NULL;
       delete node2;
       node2 = NULL;
       delete node3;
       node3 = NULL;
       delete node4;
       node4 = NULL;
       delete node5;
       node5 = NULL;
       delete node6;
       node6 = NULL;
       delete node7;
       node7 = NULL;
       return 0;
    }