Это может помочь пройти через код для нескольких вставок. Итак, предполагая, что мы вызываем insert
из функции foo
, наше дерево вызовов будет выглядеть примерно так:
foo: root = NULL;
foo: root = insert(root, 5);
insert: if (node == NULL)
insert: return newnode(data); // newnode = 0xff864000
foo: root = 0xff864000
После этого первого обращения к данным наше дерево выглядит примерно так:
Address data left right
------- ---- ---- -----
0xff864000 5 0x00000000 0x00000000
Теперь мы делаем второй вызов, чтобы вставить новое значение:
foo: root = insert(root, 3);
insert: if (node == NULL) // node == 0xff864000
insert: if (data <= node->data)
insert: node->left = insert(node->left, data);
Теперь мы снова звоним insert
; на этот раз node
является левым дочерним элементом текущего узла (который должен быть NULL):
insert(2): if (node == NULL) // node == 0x00000000
insert(2): return newnode(data); // newnode == 0xff86400c
insert: node->left = 0xff86400c;
insert: return node;
foo: root = 0xff864000
Таким образом, результат этого второго вызова insert
назначен левому потомку текущего узла, и наше дерево теперь выглядит примерно так:
Address data left right
------- ---- ---- -----
0xff864000 5 0xff86400c 0x00000000
0xff86400c 3 0x00000000 0x00000000
Добавить еще один элемент:
foo: root = insert(root, 2);
insert: if (node == NULL) // node = 0xff864000
insert: if (data <= node->data)
insert: node->left = insert(node->left, data);
insert(2): if (node == NULL) // node = 0xff86400c
insert(2): if (data <= node->data)
insert(2): node->left = insert(node->left, data);
insert(3): if (node == NULL)
insert(3): return newnode(data); // newnode = 0xff864018
insert(2): node->left = 0xff864018
insert(2): return node;
insert: node->left = 0xff86400c
insert: return node;
foo: root = 0xff8640000
А теперь наше дерево выглядит как
Address data left right
------- ---- ---- -----
0xff864000 5 0xff86400c 0x00000000
0xff86400c 3 0xff864018 0x00000000
0xff864018 2 0x00000000 0x00000000
И наконец:
foo: root = insert(root, 7);
insert: if (node == NULL) // node = 0xff864000
insert: if (data <= node->data)
insert: node->right = insert(node->right, data);
insert(2): if (node == NULL) // node = 0x0x00000000
insert(2): return newnode(data); // newnode = 0xff864024
insert: node->right = 0xff864024
insert: return node;
foo: root = 0xff8640000
Address data left right
------- ---- ---- -----
0xff864000 5 0xff86400c 0xff864024
0xff86400c 3 0xff864018 0x00000000
0xff864018 2 0x00000000 0x00000000
0xff864024 7 0x00000000 0x00000000