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) ;
}