我正在为compsci类实现许多LinkedList ADT,并且每一个都遇到相同的问题。下面列出的代码是二进制树ADT。尝试将数据输入到新节点时,编译器迷路了。代码编译时没有任何错误,但编译器未返回任何内容,我认为它在尝试查找指针时遇到了困难。我来自Java,因此我仍在研究指针。
#include <iostream>
struct TreeNode {
//represents a single node in a binary tree of int data
int data; //immediate data
TreeNode *left; //left subtree
TreeNode *right; //right subtree
TreeNode(int in);
};
TreeNode::TreeNode(int in) {
data = in;
left = NULL;
right = NULL;
}
编译器似乎找不到这两个追加函数中引用的指针。
void addLeft(TreeNode *root, int newData) {
TreeNode *new_node;
new_node->data = newData;
root->left = new_node;
}
void addRight(TreeNode *root, int newData) {
TreeNode *new_node;
new_node->data = newData;
root->right = new_node;
}
//counts nodes in binary tree from designated root point
int countNodes(TreeNode *root) {
if (!root) {
return 0; //empty tree
}
int count = 1;
count += countNodes(root->left); //adds left subtree nodes
count += countNodes(root->right); //adds right subtree countNodes
return count;
}
void preorderPrint(TreeNode *root) { //root first, then left, then right
if (root) {
std::cout << root->data << " ";
preorderPrint(root->left);
preorderPrint(root->right);
}
}
void postorderPrint(TreeNode *root) { //left first, then right, then root
if (root) {
postorderPrint(root->left);
postorderPrint(root->right);
std::cout << root->data << " ";
}
}
void inorderPrint(TreeNode *root) { //left first, then root, then right
if (root) {
inorderPrint(root->left);
std::cout << root->data << " ";
inorderPrint(root->right);
}
}
bool tree_contains(TreeNode *root, int item) {
if (!root) {
return false; //if the root doesn't exist, the tree doesn't exist
}
else if (root->data = item) {
return true; //item is found in the root node
}
else if (root->data > item) {
}
}
int main() {
TreeNode *root;
root->data = 5;
addLeft(root, 4);
addRight(root,9);
inorderPrint(root);
return 0;
}
答案 0 :(得分:1)
您的root
未初始化。当前它有一个未定义的值。应该是:
TreeNode *root = new TreeNode(5);
... // Do whatever you want
// delete root and everything else.
答案 1 :(得分:0)
指针只是在内存中保存对象地址的变量。当您定义类似
的指针时int *foo;
您尚未初始化它,所以它的值不确定。这意味着它没有保存可用于访问内存中对象的有效指针值。为了使指针实际上指向某个东西,必须为其分配一个地址:
int bar;
inf *foo = &bar;
现在foo
保存着bar
的地址,您可以取消引用foo
来写入bar
:
*foo = 42;
// bar is now 42
在您的代码中
TreeNode *root; root->data = 5;
您尝试取消引用root->data
的指针((*root).data
只是语法糖),该指针尚未初始化或未分配有效的指针值。
由于要创建一个按需增长的动态数据结构,因此要在运行时分配内存。您可以使用root
运算符:
new
但是,由于您为TreeNode *root = new TreeNode; // allocates an object of the type
// TreeNode
root->data = 5; // is now safe.
提供了一个TreeNode
的构造函数,因此您可以编写:
int
代码中的许多其他位置也是如此。
请记住,当不再需要动态分配的内存时,应将其释放:
TreeNode *root = new TreeNode{ 5 };