2009-12-08 3 views
1

Я пытаюсь сделать BST и вам нужно распечатать его в порядке, по расписанию и предзаказа.Как я могу создать дерево?

Не знаю, как создать это дерево в моей функции main().

struct Tree_Node 
{ 
    Tree_Node *right; 
    Tree_Node *left; 
    int info; 
}; 

class bTree 
{ 
private: 
    Tree_Node *root; 
public: 
    bTree(); 
    void bTree::Insert(Tree_Node*& tree, int item); 
    void bTree::preorderPrint(Tree_Node *root); 
}; 

bTree::bTree() 
{ 
    root = NULL; 
} 


void bTree::Insert(Tree_Node*& tree, int item) 
{ 
    if (tree == NULL) 
    { 
    tree = new Tree_Node; 
    tree->right = NULL; 
    tree->left = NULL; 
    tree->info = item; 
    } 
    else if (item < tree->info) 
    Insert(tree->left, item);  
    else 
    Insert(tree->right, item); 
} 

void bTree::preorderPrint(Tree_Node *root) 
{ 
    if (root != NULL) 
    { 
     cout << root->info << " "; 
     preorderPrint(root->left); 
     preorderPrint(root->right); 
    } 
} 

void main() 
{ 
// This is where I need help at 
// I'm not sure how to insert a new node 

    bTree Test; 
    Test.Insert( 
} 
+0

Является ли это домашнее задание? –

+1

Кстати, Джейк - добро пожаловать в SO! – Smashery

+0

Удалить определение 'bTree ::' в определении класса. Только несколько компиляторов по-прежнему поддерживают этот древний синтаксис. – avakar

ответ

2

Судя по всему, вы можете просто написать

Test.Insert(Test.root, 3); // Insert 3 
Test.Insert(Test.root, 4); // Insert 4 

и что должно работать. Конечно, вы должны сделать root общедоступным.

Однако это немного неудобно, так как первым параметром всегда будет bTree.root - и вам не нужно публиковать это. Помните, что пользователь вашего типа данных (вам или кому-либо еще) не должен заботиться о внутренних элементах, таких как узлы, - они только заботятся об их данных. Вместо этого я бы рекомендовал сделать метод Insert, который требует только целого (а не узла дерева) - это называется перегрузкой.

void bTree::Insert(int item) 
{ 
    Insert(root, item); 
} 

// Keep the other insert method, but make it private. 

Тогда вы можете просто написать:

Test.Insert(3); 
Test.Insert(4); 
+0

я первоначально имел это тот путь Проблема у меня есть знать, как иметь дело с двумя аргументами в ничтожной ВТКЕЕ :: Insert (Tree_Node * & дерево, внутр пункт) Как иметь дело с Tree_Node * & дерева ? – Jake

+0

Я обновил свой ответ. Надеюсь, это поможет. Вы слышали о перегрузке раньше? – Smashery

+0

Только что реализованный - в вашем существующем методе Insert вам также нужно будет проверить, что node-> left или node-> right имеет значение NULL, прежде чем передать его в Insert. Это значит, что вы можете вставить его под другим узлом (если вы передадите NULL в функцию Insert, он не будет знать, как положить дерево, так как у него нет узла для его вставки). – Smashery

1
void bTree::Insert(int item) 
{ 
    Tree_Node * node = new Tree_Node; 
    node->left = NULL; 
    node->right = NULL; 
    node->info = item; 
    if (root == NULL) 
    { 
    root = node; 
    return; 
    } 
    Tree_Node * t = root; 
    Tree_Node * p = root; 
    while(1) 
    { 
    if (item < t->info) 
    { 
     t = t->left; 
     if(t == NULL) 
     { 
      p->left = node; 
      return; 
     } 
    } 
    else if(item > t->info) 
    { 
     t = t->right; 
     if(t == NULL) 
     { 
      p->right = node; 
      return; 
     } 
    } 
    else //item already exists in the tree 
     return; 
    p = t; 
    } 

} 

//now you can insert nodes like 
Test.Insert(5); 
Test.Insert(6); 
+0

1. Конструктор по умолчанию Tree_Node должен присваивать указателям значение null. Это устраняет {беспокойство} и присваивание нуля в строках 4 и 5. 2. Создайте конструктор в Tree_Node, который принимает int. Назначьте член данных «info» с помощью списка инициализации членов: Tree_Node (int newValue) : left (NULL), right (NULL), info (newValue) {; } 3. Узел должен иметь методы для привязки к другим узлам. –

+0

Я просто показывал ему функцию вставки - класс далек от совершенства – Amarghosh

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