2013-08-31 2 views
1
typedef struct _Tree{ 
    int val; 
    struct _Tree *left; 
    struct _Tree *right; 
}Tree; 

Tree Указатель здесь? Указывает ли он на адрес val?Является ли struct name указателем?

Как насчет этого, если я определяю Tree *node? Есть node указатель, указывающий адрес Tree?

если мы хотим вставить val, следует ли использовать insert(&node) или insert(node)?

void insert_Tree(Tree **root, int key){ 
if((*root) == NULL){ 
    (*root) = (Tree *)malloc(sizeof(Tree)); 
    (*root)->val = key; 
    (*root)->left = NULL; 
    (*root)->right = NULL; 
    cout<<"insert data "<<key<<endl; 
}else if(key< (*root)->val){ 
    insert_Tree(&(*root)->left, key); 
    cout<<"go left"<<endl; 
}else{ 
    insert_Tree(&(*root)->right, key); 
    cout<<"go right"<<endl; 
} 
} 
int main(){ 

Tree *root = NULL; 
insert_Tree(&root, 10); 
insert_Tree(&root, 20); 
insert_Tree(&root, 5); 
insert_Tree(&root, 100); 
} 
+0

Что касается последнего вопроса, если ваш 'insert()' должен потенциально модифицировать * значение * передаваемого указателя, то вам необходимо передать его по адресу (то есть указателю на указатель). Это является общим для кода списка/дерева, который передает указатель head/root, который может быть изменен. В качестве альтернативы вы можете использовать функцию «insert()' function * return * новое значение указателя, но я предпочитаю использовать прежний вариант, так как мне нравится, что мои API управляют списком/деревом; не полагайтесь на * caller *, чтобы сохранить новый заголовок/корень путем перезаписывания. – WhozCraig

ответ

3

Нет, Tree не является указатель или любым переменным вообще, это typedef псевдонима struct _Tree, и может быть использовано взаимозаменяемо с ним.

Если вы заявляете Tree *node, вы указали указатель на структуру Tree, но сама фактическая структура не указана.

Как работает ваш insert функционал функции, трудно сказать, без дополнительного кода.

0

Вот более простой способ определить эту простую структуру:

typedef struct{ 
    int val; 
    Tree *left; 
    Tree *right; 
}Tree; 

Используя эту структуру, как правило, выглядит следующим образом:

Tree top; 
Tree left; 
Tree right; 

top.val = 0; 
top.left = &left; 
top.right = &right;   

Как вы можете видеть, дерево не является указателем здесь , но определение структуры типа. Он действует как тип, что означает, что вы можете создать экземпляр переменной с деревом типов. Кроме того, вам нужно использовать опорный знак (&), чтобы назначить указатели на левый и правый деревья, поскольку элементы структуры (слева и справа) являются указателями на Дерево.

+0

Я вставляю код, вы можете видеть даже val, использовать шаблон и знак. – hellocoding

4

Tree не указатель. Это псевдоним для пользовательского типа struct _Tree. Поэтому, когда вы объявляете новую переменную, вместо того, чтобы вводить

struct _Tree foo; 

вы можете просто ввести

Tree foo; 

Два эквивалентны.

Если вы объявляете

Tree *node; 

Унарный * оператор в С оператором разыменования/Косвенным, и поэтому то, что вы говорите: *node или разыменованное значение node, является Tree. Другими словами, node является указателем на Tree, то есть указателем на struct _Tree.

Этот указатель инициализирован, пока не выделять для него память:

node = malloc (sizeof (Tree)); 

Пока эта память не выделяется, указатель указывает на некоторое неопределенное место.После того, как выделяется память, вы можете вставить val в узел, как это:

node->val = val; 

Как вставить этот node сам в бинарное дерево является интересной проблемой. Что вы пробовали?

+0

спасибо многословным, я вставляю код. 1) узел дерева; 2) Дерево * узел; 1) и 2) разные, не так ли? Я думаю, что 1) узел - это просто другое имя дерева 2) * node является указателем на структуру дерева. Мое понимание в порядке? Спасибо – hellocoding

+0

'Tree node;' будет объявлять переменную типа 'Tree'. 'Tree * node' объявляет указатель на' Tree'. Они очень разные, как и 'int a;' и 'int * a;' – verbose

+0

Как правило, вы рекомендуете, когда нам нужно управлять деревом, Tree * node или Tree node? Я просмотрел множество программ, узел Tree * чаще встречается, как вы думаете? – hellocoding

0

Tree - это тип данных, определенный вашим собственным кодом. Обратите внимание, как вы вызываете его в своем коде, он находится там же, где может быть int или double.

Поскольку это тип данных, то вы можете также определить его как указатель:

Tree *root; 

root является указателем на структуру типа/данных «Дерево». root всего 4 байта и не выделить структуру дерева.

Или Дерево может быть структурирована/отформатированный набор ячеек памяти:

Tree node; 

node является древовидная структура и выделяется фактические места хранения. Если вам нужно передать адрес узла, то укажите: &node, это создает указатель на места хранения в «узле».

Я думаю, что ваши другие вопросы зависят от понимания типа данных Tree.

В общем, как вы начинаете программировать, вам не нужно будет определять двойные указатели, такие как Tree **root, поэтому пересмотрите свой код и упростите его.

Надеюсь, это поможет.

+0

Спасибо. Если я использую Tree * root, это будет root-> val. Если я использую корень дерева, это будет root.val. Когда следует использовать первое и когда использовать последнее? – hellocoding

+0

* root - указатель на структуру дерева. Указатели хороши для построения связанных списков, деревьев и т. Д. Когда вы думаете об этом, не смешивайте имена.Если вы определяете «Tree * root», вы никогда не будете кодировать root.val. но вы можете определить «Tree node» и код 'node.val' – JackCColeman