Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;二叉搜索树和指针_C++_Binary Search Tree - Fatal编程技术网

C++ C++;二叉搜索树和指针

C++ C++;二叉搜索树和指针,c++,binary-search-tree,C++,Binary Search Tree,你能告诉我为什么存在对binaryTree.5方法的调用吗说“5在二叉树中不存在”?调试时,就像尝试访问插入5的节点不再存在一样。我不明白为什么。谢谢你 #include <iostream> using namespace std; class Node { private: int _value; Node* left; Node* right; public: Node(int value)

你能告诉我为什么存在对binaryTree.5方法的调用吗说“5在二叉树中不存在”?调试时,就像尝试访问插入5的节点不再存在一样。我不明白为什么。谢谢你

#include <iostream>

using namespace std;


class Node
{
    private:
        int _value;
        Node* left;
        Node* right;

    public:
        Node(int value):_value(value), left(NULL), right(NULL)
        {
        }
        Node* returnLeftChild()
        {
            return left;
        }
        Node* returnRightChild()
        {
            return right;
        }
        void setLeftChild(Node* l)
        {
            left=l;
        }
        void setRightChild(Node* r)
        {
            right=r;
        }
        int getValue()
        {
            return _value;
        }
};

class BinaryTree
{
    private:
        Node parent;
        void AddToOneTree(Node* parent, int value)
        {
            if (value==parent->getValue())
            {
                return;
            }
            if (value>parent->getValue())
            {
                if (parent->returnRightChild()==NULL)
                {
                    Node newNode(value);
                    parent->setRightChild(&newNode);
                    return;
                }
                else
                {
                    AddToOneTree(parent->returnRightChild(), value);
                }
            }
            if (value<parent->getValue())
            {
                if (parent->returnLeftChild()==NULL)
                {
                    Node newNode(value);
                    parent->setLeftChild(&newNode);
                    return;
                }
                else
                {
                    AddToOneTree(parent->returnLeftChild(), value);
                }
            }           
        }

        void LookForValue(Node* parent, int value, bool found)
        {
            if (value>parent->getValue())
            {
                if (parent->returnRightChild()!=NULL)
                {
                    if (parent->returnRightChild()->getValue()==value)
                    {
                        found= true;
                        goto HERE;
                    }
                    else
                    {
                        LookForValue(parent->returnRightChild(), value, found);
                    }
                }
            }
            else if (value<parent->getValue())
            {
                if (parent->returnLeftChild()!=NULL)
                {
                    if (parent->returnLeftChild()->getValue()==value)
                    {
                        found= true;
                        goto HERE;
                    }
                    else
                    {
                        LookForValue(parent->returnLeftChild(), value, found);
                    }
                }
            }
            HERE:;
        }

    public:
        BinaryTree(int parentValue):parent(parentValue)
        {   
        }

        void Add(int value)
        {
            AddToOneTree(&parent, value);
        }

        void Exists(int value)
        {
            bool found = false;
            if (parent.getValue()==value)
            {
                cout << value << " exists in the Binary Tree." << endl;
            }
            else{
                LookForValue(&parent, value, found);
                if (found)
                {
                    cout << value << " exists in the Binary Tree." << endl;
                }else
                {
                    cout << value << " doesn't exist in the Binary Tree." << endl;
                }
            }
        }

};

int main()
{
    BinaryTree binaryTree(9);
    binaryTree.Add(5);
    binaryTree.Add(5);

    binaryTree.Exists(9);
    binaryTree.Exists(5);
}
#包括
使用名称空间std;
类节点
{
私人:
int_值;
节点*左;
节点*右;
公众:
节点(int值):_值(value)、左(NULL)、右(NULL)
{
}
节点*returnLeftChild()
{
左转;
}
节点*returnRightChild()
{
返还权;
}
void setLeftChild(节点*l)
{
左=l;
}
void setRightChild(节点*r)
{
右=r;
}
int getValue()
{
返回_值;
}
};
类二叉树
{
私人:
节点父节点;
void AddToOneTree(节点*父节点,int值)
{
如果(值==parent->getValue())
{
返回;
}
如果(值>父项->获取值())
{
如果(父级->返回RightChild()==NULL)
{
节点newNode(值);
父节点->setRightChild(&newNode);
返回;
}
其他的
{
AddToOneTree(父->returnRightChild(),值);
}
}
if(valuegetValue())
{
if(parent->returnLeftChild()==NULL)
{
节点newNode(值);
父节点->setLeftChild(&newNode);
返回;
}
其他的
{
AddToOneTree(父->returnLeftChild(),值);
}
}           
}
void LookForValue(节点*父节点,int值,bool found)
{
如果(值>父项->获取值())
{
if(parent->returnRightChild()!=NULL)
{
如果(父项->返回右项子项()->getValue()==值)
{
发现=真;
转到这里;
}
其他的
{
LookForValue(父级->returnRightChild(),值,已找到);
}
}
}
else if(valuegetValue())
{
if(parent->returnLeftChild()!=NULL)
{
如果(父项->返回左项子项()->getValue()==值)
{
发现=真;
转到这里;
}
其他的
{
LookForValue(父->returnLeftChild(),值,已找到);
}
}
}
在这里:;
}
公众:
二进制树(int parentValue):父(parentValue)
{   
}
无效添加(int值)
{
AddToOneTree(父项和值);
}
存在void(int值)
{
bool-found=false;
if(parent.getValue()==value)
{

cout您应该替换此字符串:

void LookForValue(Node* parent, int value, bool found)
为此:

void LookForValue(Node* parent, int value, bool &found)
或者只需在
LookForValue
函数中将返回值设置为
bool
,并编写如下内容:

found = LookForValue(&parent, value, found);
bool LookForValue(Node* parent, int value, bool found)
{
            if (value>parent->getValue())
            {
                if (parent->returnRightChild()!=NULL)
                {
                    if (parent->returnRightChild()->getValue()==value)
                    {
                        return true ;
                    }
                    else
                    {
                        LookForValue(parent->returnRightChild(), value, found);
                    }
                }
            }
            else if (value<parent->getValue())
            {
                if (parent->returnLeftChild()!=NULL)
                {
                    if (parent->returnLeftChild()->getValue()==value)
                    {
                        return true ;
                    }
                    else
                    {
                        LookForValue(parent->returnLeftChild(), value, found);
                    }
                }
            }
}
bool LookForValue(Node* parent, int value, bool &found)

您的代码中有几个问题

第一个是,
LookForValue
函数从不返回找到的布尔值。您可以将bool-found更改为bool&found,这样就不必返回任何内容,也可以将
LookForValue
的返回类型更改为
bool
,在这种情况下,您需要将代码更改为类似以下内容:

found = LookForValue(&parent, value, found);
bool LookForValue(Node* parent, int value, bool found)
{
            if (value>parent->getValue())
            {
                if (parent->returnRightChild()!=NULL)
                {
                    if (parent->returnRightChild()->getValue()==value)
                    {
                        return true ;
                    }
                    else
                    {
                        LookForValue(parent->returnRightChild(), value, found);
                    }
                }
            }
            else if (value<parent->getValue())
            {
                if (parent->returnLeftChild()!=NULL)
                {
                    if (parent->returnLeftChild()->getValue()==value)
                    {
                        return true ;
                    }
                    else
                    {
                        LookForValue(parent->returnLeftChild(), value, found);
                    }
                }
            }
}
bool LookForValue(Node* parent, int value, bool &found)
我还没有测试代码,所以可能还有其他问题

下次遇到这样的问题时,我建议您尝试使用gdb,因为它可能有助于检测您的代码真正在做什么,这样您就可以找出可能的错误。例如,在这里,您可以看到,在您的
Exists
函数中,仅通过“打印”从未将find设置为true逐步查找
变量的值

另外,我认为你设计类的方式并不太好。父类应该是一个指针,指向树的根。我建议你完全重新设计你的代码。你可以在网上找到一些好的实现,你可以把它们作为你的代码


最后,goto肯定是个坏主意……我也会摆脱它。

至少函数
AddToOneTree
是错误的,是程序未定义行为的原因

例如,在这个代码块中

if (parent->returnRightChild()==NULL)
{
    Node newNode(value);
    parent->setRightChild(&newNode);
    return;
}
您创建了一个局部变量
newNode
,并将其地址指定给右子级的指针。但是,由于该变量是局部变量,因此在控件离开代码块后它将被销毁,树中相应的指针将无效

您需要动态分配节点并将它们添加到树中

更好的设计是当类
BinaryTree
包含一个指向树头的ponter时

class BinaryTree
{
    private:
        Node *parent;
             ^^^^^^^^
    //...
并相应地重写该类。:)

您正在按值传递
found
。这意味着将复制该值。当您在方法
LookForValue
内部更改
found
时,您仅更改此副本

void LookForValue(Node* parent, int value, bool& found)
这将通过引用进行查找,因此如果在
LookForValue
中对其进行更改,
Exists
方法中的原始值也将更改

您也可以只返回如下bool值:

found = LookForValue(&parent, value, found);
bool LookForValue(Node* parent, int value, bool found)
{
            if (value>parent->getValue())
            {
                if (parent->returnRightChild()!=NULL)
                {
                    if (parent->returnRightChild()->getValue()==value)
                    {
                        return true ;
                    }
                    else
                    {
                        LookForValue(parent->returnRightChild(), value, found);
                    }
                }
            }
            else if (value<parent->getValue())
            {
                if (parent->returnLeftChild()!=NULL)
                {
                    if (parent->returnLeftChild()->getValue()==value)
                    {
                        return true ;
                    }
                    else
                    {
                        LookForValue(parent->returnLeftChild(), value, found);
                    }
                }
            }
}
bool LookForValue(Node* parent, int value, bool &found)
然后只写
返回true;
而不是

found= true;
goto HERE;

这样你也就摆脱了后顾之忧。

谢谢大家。我有c