Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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++_Pointers_Data Structures_Binary Search Tree - Fatal编程技术网

C++ 二进制排序树-从内存位置获取值

C++ 二进制排序树-从内存位置获取值,c++,pointers,data-structures,binary-search-tree,C++,Pointers,Data Structures,Binary Search Tree,嘿,伙计们,在获取树中每个节点的父节点和兄弟节点的打印输出时遇到了一些问题。 下面是完整的代码块 /* --------------- Binary sort tree */ #include <iostream> #include <cstdlib> #include <cstdint> using namespace std; class BinSearchT { private: struct tr_node

嘿,伙计们,在获取树中每个节点的父节点和兄弟节点的打印输出时遇到了一些问题。 下面是完整的代码块

/*
---------------
Binary sort tree
*/

#include <iostream>
#include <cstdlib>
#include <cstdint>
using namespace std;

class BinSearchT
{
    private:
        struct tr_node
        {
           tr_node* left;
           tr_node* right;
           tr_node* parent;
           int data;
        };
        tr_node* root;
    public:
        BinSearchT()
        {
           root = NULL;
        }
        bool isEmpty() const { return root==NULL; }
        void pInorder();
        void inorder(tr_node*);
        void insert(int);
        void remove(int);
};


void BinSearchT::insert(int d)
{
    tr_node* t = new tr_node;
    //tr_node* parent;
    t->data = d;
    t->left = NULL;
    t->right = NULL;
    t->parent = NULL;
  // is this a new tree?
  if(isEmpty()) root = t;
  else
  {
    //Note: ALL insertions are as leaf nodes
    tr_node* curr;
    curr = root;
    // Find the Node's parent
    while(curr)
    {
        t->parent = curr;
        if(t->data > curr->data) curr = curr->right;
        else curr = curr->left;
    }

    if(t->data < t->parent->data)
       t->parent->left = t;
    else
       t->parent->right = t;
  }
}



void BinSearchT::pInorder()
{
  inorder(root);
}

void BinSearchT::inorder(tr_node* p)
{
    if(p != NULL)
    {
        if(p->left) inorder(p->left);
        //int left=*reinterpret_cast<int *>(p->left);
        //int right=*reinterpret_cast<int *>(p->right);
        //int parent=*reinterpret_cast<int *>(p->parent);
        cout<<"\n "<<p->data<<" Left: "<<p->left->data<<" Right: "<<p->right->data<<" Parent: "<<p->parent->data<<endl;


        if(p->right) inorder(p->right);
    }
    else return;
}

int main()
{
    BinSearchT b;
    int ch,tmp,tmp1;
    while(1)
    {
       cout<<endl<<endl;
       cout<<" BinSearchTOps "<<endl;
       cout<<" ----------------------------- "<<endl;
       cout<<" 1. Insertion/Creation "<<endl;
       cout<<" 2. In-Order Traversal "<<endl;
       cout<<" 3. Exit "<<endl;
       cout<<" Enter your choice : ";
       cin>>ch;
       switch(ch)
       {
           case 1 : cout<<" Enter Number to be inserted(just one) : ";
                    cin>>tmp;
                    b.insert(tmp);
                    break;
           case 2 : cout<<endl;
                    cout<<" In-Order Traversal "<<endl;
                    cout<<" -------------------"<<endl;
                    b.pInorder();
                    break;
           case 3 : system("pause");
                    return 0;
                    break;
       }
    }
}
但应该是这样

2  Left: Null     Right:Null     Parent:4
4  Left: 2        Right:5        Parent:8
5  Left: Null     Right:Null     Parent:4
8  Left: 4        Right:Null     Parent:10
10 Left: 8        Right:20       Parent:Null    
15 Left: Null     Right:17       Parent:20
17 Left: Null     Right:Null     Parent:15
20 Left: 15       Right:Null     Parent:10
正如您所看到的,数字在哪里匹配,内存位置也匹配,这支持了这样一个事实,即它正在工作,只需要获取数字而不是内存地址。

添加
#在文件顶部包括
,以格式化输出,就像我在这个回答中所做的那样:

您只是没有检查指针是否有效。如果指向子节点的指针为NULL,则无法访问该节点的
数据
属性,因为尚未为其分配内存

此外,请记住,如果您发现自己需要访问内存中的原始地址,而不是使用简单的指针,那么您很可能是做错了什么/做得很艰难

只需检查子节点/父节点是否为null

setw(4)
left
将宽度设置为4,并将输出格式化为左对齐

#include <iomanip>

...

void BinSearchT::inorder(tr_node* p)
{
    if(p != NULL)
    {
        if(p->left) inorder(p->left);

        if (p->left)
            cout << "Left: " << setw(4) << left << p->left->data << "\t";
        else
            cout << "Left: Null\t";

        if (p->right)
            cout << "Right: " << setw(4) << left << p->right->data << "\t";
        else
            cout << "Right: Null\t";

        if (p->parent)
            cout << "Parent: " << setw(4) << left << p->parent->data << endl;
        else
            cout << "Parent: Null" << endl;

        if(p->right) inorder(p->right);
    }
    else 
        return;
}

显然,您在代码的这一部分遇到了问题:

if(p->left) inorder(p->left);
        //int left=*reinterpret_cast<int *>(p->left);
        //int right=*reinterpret_cast<int *>(p->right);
        //int parent=*reinterpret_cast<int *>(p->parent);
        cout<<"\n "<<p->data<<" Left: "<<p->left->data<<" Right: "<<p->right->data<<" Parent: "<<p->parent->data<<endl;

if(p->left){
标准::cout(右){

std::cout为什么在将int写入该位置后不直接读取
p->data
?什么是
reinterpret\u cast(p->left)
应该做什么?根据我在这里所写内容的理解->它应该遵循内存地址。在你注释出的代码打印出来后的第一行是什么?谢谢,我可以和我的教授交谈,她指出了同样的事情,我没有检查空值作为w这是我丢失的->数据。我感谢你的帮助。
#include <iomanip>

...

void BinSearchT::inorder(tr_node* p)
{
    if(p != NULL)
    {
        if(p->left) inorder(p->left);

        if (p->left)
            cout << "Left: " << setw(4) << left << p->left->data << "\t";
        else
            cout << "Left: Null\t";

        if (p->right)
            cout << "Right: " << setw(4) << left << p->right->data << "\t";
        else
            cout << "Right: Null\t";

        if (p->parent)
            cout << "Parent: " << setw(4) << left << p->parent->data << endl;
        else
            cout << "Parent: Null" << endl;

        if(p->right) inorder(p->right);
    }
    else 
        return;
}
 BinSearchTOps 
 ----------------------------- 
 1. Insertion/Creation 
 2. In-Order Traversal 
 3. Exit 
 Enter your choice : 2

 In-Order Traversal 
 -------------------
Left: Null  Right: Null Parent: 4   
Left: 2     Right: 5    Parent: 8   
Left: Null  Right: Null Parent: 4   
Left: 4     Right: Null Parent: 10  
Left: 8     Right: 20   Parent: Null
Left: Null  Right: 17   Parent: 20  
Left: Null  Right: Null Parent: 15  
Left: 15    Right: Null Parent: 10  
if(p->left) inorder(p->left);
        //int left=*reinterpret_cast<int *>(p->left);
        //int right=*reinterpret_cast<int *>(p->right);
        //int parent=*reinterpret_cast<int *>(p->parent);
        cout<<"\n "<<p->data<<" Left: "<<p->left->data<<" Right: "<<p->right->data<<" Parent: "<<p->parent->data<<endl;
if ( p->left && p->right )
cout<<"\n "<<p->data<<" Left: "<<p->left->data<<" Right: "<<p->right->data<<" Parent:" <<p->parent->data<<endl;
    if(p->left) {
    std::cout << " Left: "<<p->left->data<< std::endl ;
    inorder(p->left);
}

    if(p->right) {
    std::cout << " Right: "<<p->right->data<< std::endl ;
    inorder(p->right) ;
}