2015-10-22 6 views
0

Я узнаю о бинарных деревьях. Я смотрел на веб-сайте Стэнфорда: http://cslibrary.stanford.edu/110/BinaryTrees.html Существует проблема с практикой создания дерева путем вызова newNode() три раза и использования трех переменных указателя. Были указаны структура и newNode. Я пытался распечатать узлы.Узлы печати двоичного дерева C++

struct node { 
    int data; 
    struct node* left; 
    struct node* right; 
} ; 

/* 
Helper function that allocates a new node 
with the given data and NULL left and right pointers. 
*/ 
struct node* newNode(int data) { 
    struct node* node = new(struct node); 
    node->data = data; 
    node->left = NULL; 
    node->right = NULL; 

    return(node); 
}; 

// call newNode() three times 
struct node* build123a() { 
    struct node* root = newNode(2); 
    struct node* lChild = newNode(1); 
    struct node* rChild = newNode(3); 
    root->left = lChild; 
    root->right= rChild; 

    return(root); 
} 

int main() { 

    struct node* test = build123a(); 
    cout << "root: " << test->data << endl; 
    cout << "left: " << test->left << endl; 
    cout << "right: " << test->right << endl; 

    return 0; 
} 

Проблема в том, что это печатает только целое число в корне. Для левого и правого узлов он распечатывает адреса. Мое знание указателей все еще немного шаткое. Но не имеет значения, что я вернул только корень? newNode - это указатель на узел справа? Просто найдите простое исправление, чтобы распечатать левый и правый узлы.

+1

Нарисуйте структуру на бумаге, с кругами, как узлы и указатели, как стрелки на другие узлы. – Surt

ответ

1
struct node { 
    int data; // the actual data contained inside this node 
    struct node* left; // a node pointer that points to the left child 
    struct node* right; // a node pointer that points to the right child 
}; 

struct node* test; // is a node pointer 
test->left; // is a node pointer that points to the left child of test 
test->right; // is a node pointer that points to the right child of test 

cout << test->data; // prints the integer contained within the test node 
cout << test->left; // prints the address of the left child of test since it's a pointer 
cout << test->right; // prints the address of the right child of test since it's a pointer 

Что вы хотите сделать, это распечатать данные, содержащиеся в левом и правом дочерних элементах.

cout << test->left->data; 
cout << test->right->data; 
1

test->left является (*test).left который имеет тип struct node*.

Чтобы распечатать данные в left вам нужен

cout << (test -> left -> data); 
2

Это потому, что 'левые' & 'правый' являются указателей.

Чтобы распечатать «данные» в левой или правой, изменить код следующим образом:

< < соиЬ «слева» < < тест-> лево-> Данные < < епсИ;

< < соиЬ "справа:" < < тест-> право-> Данные < < епсИ;

Обратите внимание, что если слева или справа NULL (то есть, ноль), вы, скорее всего, получите исключение доступа к памяти.

1

Вы можете распечатать «test-> data» правильно, потому что это int. Проблема в том, что «test-> left» и «test-> right» являются указателями, а указатели - это в основном номера, которые относятся к тому, где хранится другой объект.

Если вы хотите распечатать данные в левый узел, вы должны были бы сделать это:

cout << "left: " << test->left->data << endl; 

И тогда вам придется делать то же самое для правого узла.

Смежные вопросы