summaryrefslogtreecommitdiff
path: root/src/02/03/btree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/02/03/btree.c')
-rw-r--r--src/02/03/btree.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/src/02/03/btree.c b/src/02/03/btree.c
index b44e173..8601927 100644
--- a/src/02/03/btree.c
+++ b/src/02/03/btree.c
@@ -23,13 +23,15 @@ static void inspect(BTree *tree, int level) {
}
/**
- * Initializes the root of a binary tree
+ * Initializes an new subtree in a binary tree
*
+ * @param parent the parent of the new btree node
* @param data the data to assign to the root of the tree.
- * @return Returns the root of the tree.
+ * @return Returns the new subtree
*/
-BTree *btree_init(int data) {
+BTree *btree_initialize(BTree *parent, int data) {
BTree *tree = malloc(sizeof(BTree));
+ tree->parent = parent;
tree->left = NULL;
tree->right = NULL;
tree->data = data;
@@ -66,7 +68,21 @@ List *btree_to_list(BTree *tree)
int btree_size(BTree *tree) {
List *list = btree_to_list(tree);
- return list_size(list);
+ return list ? list_size(list) : 0;
+}
+
+BTree *btree_rebalance(BTree *tree)
+{
+ if (!tree->parent)
+ return tree;
+
+ int size = btree_size(tree);
+ int parent_size = btree_size(tree->parent);
+ /*float ratio = size / parent_size;*/
+ float ratio = 0.0;
+ printf("%d / %d = %f\n", size, parent_size, ratio);
+
+ return tree;
}
/**
@@ -77,18 +93,19 @@ int btree_size(BTree *tree) {
*/
BTree *btree_insert(BTree *tree, int data) {
if (!tree)
- return btree_init(data);
+ return btree_initialize(NULL, data);
if (data <= tree->data)
if (tree->left)
btree_insert(tree->left, data);
else
- tree->left = btree_init(data);
+ tree->left = btree_initialize(tree, data);
else if (tree->right)
btree_insert(tree->right, data);
else
- tree->right = btree_init(data);
+ tree->right = btree_initialize(tree, data);
+ /*return btree_rebalance(tree);*/
return tree;
}