# Week 10 - Balanced Binary Trees
## Team
Team name: Peach Technologies
Date: 07/12/2022
Members
| Role | Name |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------|
| **Facilitator** keeps track of time, assigns tasks and makes sure all the group members are heard and that decisions are agreed upon. | Husam Kanoa 512881 |
| **Spokesperson** communicates group’s questions and problems to the teacher and talks to other teams; presents the group’s findings. | Rimma Davletova 508350 |
| **Reflector** observes and assesses the interactions and performance among team members. Provides positive feedback and intervenes with suggestions to improve groups’ processes. | Yazan Tayeh 473427 |
| **Recorder** guides consensus building in the group by recording answers to questions. Collects important information and data. | Nafiz Redwan 515199 |
## Activities
Make sure to have the activities signed off regularly to ensure progress is tracked.
Download the provided project and open it in CLion. **NOTE**: in this week you will have to reuse the code of last week. Follow the instructions given in the `main.cpp` file.
### Activity 1: Time complexity
How many levels does the tree have? Give a formula that gives the minimum number of levels in case the tree has n values.
- log2(n)
What is the worst-case time complexity of removal and membership testing in a tree with n values where the number of levels is kept as low as possible?
- O(log2[n])
### Activity 2: Remembering tree heights
```c++
void bintree_node::update_height() {
// TODO: set m_height to the correct height
m_height = ((m_left->height()>m_right->height())?m_left->height():m_right->height())+1;
}
```
### Activity 3: Do it yourself: Balance factors
Left tree (Figure 3a):
| Node | Height | Balance factor |
|------|:------:|:--------------:|
| A | 0 | 0 |
| B | 1 | -1 |
| C | 2 | -2 |
| D | 1 | +1 |
| E | 2 | 0 |
| F | 3 | 0 |
| G | 3 | 0 |
| H | 2 | 0 |
Right tree (Figure 3b):
| Node | Height | Balance factor |
|------|:------:|:--------------:|
| K | 0 | 0 |
| L | 1 | -1 |
| M | 2 | 0 |
| N | 2 | 0 |
| P | 3 | 0 |
| Q | 3| 0 |
| R | 1| +1 |
### Activity 4: Computing the balance factor
```c++
int bintree_node::balance() const {
// TODO: compute balance factor
return 0;
}
```
### Activity 5: Balancing acts
D
### Activity 6: Implement left rotation
```c++
void bintree_node::rotate_left() {
auto parent = m_parent;
auto r = m_right;
auto rl = m_right->m_left;
(void) parent;
(void) r;
(void) rl;
// TODO: update linkage (use replace_child, set_left, set_right)
r->m_right = parent;
parent->m_right = rl;
// TODO: update heights (use update_height, only for some nodes)
parent->update_height();
r->update_height();
}
```
Record your answer here
### Activity 7: Implement right rotation
```c++
void bintree_node::rotate_right() {
auto parent = m_parent;
auto l = m_left;
auto lr = m_left->m_right;
(void) parent;
(void) l;
(void) lr;
// TODO: update linkage (use replace_child, set_left, set_right)
l->m_right = parent;
parent->m_left = lr;
// TODO: update heights (use update_height, only for some nodes)
parent->update_height();
l->update_height();
}
```
### Activity 8: Left rotations and balance
| A (Balance) | C (Balance) | B Height | D Height | E Height | Balance after rot |
|-------------|:-----------:|:--------:|----------|----------|-------------------|
| +2 | -1 | H | H + 1 | H | -2 |
| +2 | 0 | H | H + 1 | H + 1 | -1 |
| +2 | +1 | H | H | H + 1 | 0 |
| +2 | +2 | H | H | H + 2 | +1 |
### Activity 9: Right rotations and balance
| A (Balance) | B (Balance) | C Height | D Height | E Height | Balance after rot |
|-------------|:-----------:|:--------:|----------|----------|-------------------|
| -1 | -1 | H | H - 1 | H | +1 |
| -1 | 0 | H | H | H | +1 |
| -1 | +1 | H - 1 | H | H | +2 |
## Activity 10: Fixing right-heavy trees using rotation combos
##### • For which of the three cases do we need to perform a right-left rotation?
-1
##### • For the case where an RL rotation is applied, what are the possible balance factors of the tree after the RL rotation?
0 and +1
##### • For the cases where only a left rotation is applied, what are the possible balance factors of the tree after the left rotation?
-1 and 0
### Activity 11: Fixing left-heavy trees
##### • For which of the three cases do we need to perform a left-right rotation?
-1
##### • For the case where an LR rotation is applied, what are the possible balance factors of the tree after that rotation combo?
-1 and 0
##### • For the cases where only a right rotation is applied, what are the possible balance factors of the tree after the rotation?
+1 and 0
### Activity 12: Rebalancing the tree
```c++
/// Activity 12: restores the balance of a left-heavy tree
void bintree_node::fix_left_heavy() {
switch (m_left->balance()) {
case 0:
break;
case -1:
m_right->rotate_right();
rotate_left();
break;
case +1:
rotate_right();
break;
}
}
/// Activity 12: restores the balance of a right-heavy tree
void bintree_node::fix_right_heavy() {
switch (m_right->balance()) {
case 0:
break;
case +1:
m_left->rotate_left();
return rotate_right();
break;
case -1:
return rotate_left();
break;
}
}
```
### Activity 13: Verify balance
Record your answer here (include an image of the final tree)
##### 1. What is the height of the (root node of the) final tree?
15
##### 2. What is the balance factor of the (root node of the) final tree?
16
##### 3. How many rotations (left or right) were performed during the insertion of the 15 values?
## Looking back
### What we've learnt
Formulate at least one lesson learned.
### What were the surprises
Fill in...
### What problems we've encountered
Fill in...
### What was or still is unclear
Fill in...
### How did the group perform?
How was the collaboration? What were the reasons for hick-ups? What worked well? What can be improved next time?