# Week 10 - Balanced Binary Trees
## Team
Team name:
Date:
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. | |
| **Spokesperson** communicates group’s questions and problems to the teacher and talks to other teams; presents the group’s findings. | |
| **Reflector** observes and assesses the interactions and performance among team members. Provides positive feedback and intervenes with suggestions to improve groups’ processes. | |
| **Recorder** guides consensus building in the group by recording answers to questions. Collects important information and data. | |
## 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
De formule heeft minimaal log2(n) levels. De uitkomst moet je naar beneden afronden en dan krijg je het antwoord. voorbeeld: log2(6) = 2.58496250072, dit rond je af naar twee en dan heb je de minimale aantal levels.
### Activity 2: Remembering tree heights
```c++
void bintree_node::update_height() {
// TODO: set m_height to the correct height
if(this->m_left && this->m_right) {
this->m_height = std::max(this->m_left->m_height, this->m_right->m_height) + 1;
} else if(this->m_left) {
this->m_height = this->m_left->m_height + 1;
} else if(this->m_right){
this->m_height = this->m_right->m_height + 1;
}
}
```
### Activity 3: Do it yourself: Balance factors
Left tree (Figure 3a):
| Node | Height | Balance factor |
|------|:------:|:--------------:|
| A | 4 | 1 |
| B | 2| -1 |
| C | 1| 0 |
| D | 3| -1 |
| E | 2| 0 |
| F | 1| 0 |
| G | 1| 0 |
| H | 1| 0 |
Right tree (Figure 3b):
| Node | Height | Balance factor |
|------|:------:|:--------------:|
| K | 4 |-2 |
| L | 3 | 1 |
| M | 1 | 0 |
| N | 2 | 0 |
| P | 1 | 0 |
| Q | 1 | 0 |
| R | 1 | 0 |
### Activity 4: Computing the balance factor
```c++
int bintree_node::balance() const {
// TODO: compute balance factor
int left = 0;
int right = 0;
if(this->m_left != NULL) left = this->m_left->m_height;
if(this->m_right != NULL) right = this->m_right->m_height;
auto balance = right - left;
return balance;
}
```
### Activity 5: Balancing acts
C is correct omdat deze tree aan alle voorwaarden voldoet.
### 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;
// TODO: update linkage (use replace_child, set_left, set_right)
// TODO: update heights (use update_height, only for some nodes)
}
```
```c=
void bintree_node::rotate_left() {
// Week 10 - Activity ?
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)
m_parent = r;
m_parent->set_left(parent);
m_parent->m_left->set_right(rl);
// TODO: update heights (use update_height, only for some nodes)
m_parent->update_height();
m_left->update_height();
}
```
### 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)
set_left(lr);
parent->replace_child(this, l);
l->set_right(this);
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-1 | H+1 | 0 |
### 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
1. bij +1 en 0 moet je right-left toepassen.
2. Bij RL krijg je altijd balance-factor 0.
3. Daar komt balance 0 uit
### Activity 11: Fixing left-heavy trees
1. bij -1 en 0 moet je left-right toepassen.
2. Bij LR krijg je balance-factor 0.
3. Daar komt balance 0 uit
### 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:
case -1:
case +1:
break;
}
}
/// Activity 12: restores the balance of a right-heavy tree
void bintree_node::fix_right_heavy() {
switch (m_right->balance()) {
case 0:
case +1:
case -1:
break;
}
}
```
### Activity 13: Verify balance
Record your answer here (include an image of the final tree)
## 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?