---
# System prepended metadata

title: Week 10 - Balanced Binary Trees

---

# Week 10 - Balanced Binary Trees

## Team

Team name: BeastsFromTheEast
Date: 31/07/2023

Members: Attila Poldan, Nikola Zahariev, Casian Ionescu, Alexandra Melei

| 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

Record your answer here
log2(n)

### Activity 2: Remembering tree heights

```c++
void bintree_node::update_height() {  
    // TODO: set m_height to the correct height  
    
	if(is_leaf())
	{
		m_height = 1;

	}

	if(has_left_child() && !has_right_child())
	{
		m_height = m_left->m_height + 1;

	}
    
	if(has_right_child() && !has_left_child())
	{
		m_height = m_right->m_height + 1;

	}
    
	if(has_left_child() && has_right_child())
	{
		m_height = std::max(m_left->m_height,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  
    
  	if(is_leaf())
	{
		return 0;
	}
    
	if(!has_right_child() && has_left_child())//because the left tree will be bigger than right, so it will be left heavy
	{
		return -(m_left->m_height);
	}
    
	if(!has_left_child() && has_right_child())
	{
		return m_right->m_height;
	}
    
	if(has_left_child() && has_right_child())
	{
		return m_right->m_height - m_left->m_height;
	} 
}
```

### Activity 5: Balancing acts

Record your answer here: c)

### 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) r;
    (void) rl;
    // TODO: update linkage (use replace_child, set_left, set_right)
    
	parent->replace_child(this,r);
	set_right(rl);
	r->set_left(this);
    // TODO: update heights (use update_height, only for some nodes)
	this->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)

	parent->replace_child(this,l);
	set_left(lr);
	l->set_right(this);
	// TODO: update heights (use update_height, only for some nodes)
	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     |          |          |          |                   |
| +2          |      0      |    H     |  H + 1   |  H + 1   |       -1          |
| +2          |      +1     |          |          |          |                   |
| +2          |      +2     |          |          |          |                   |

### 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      |          |          |          |                   |
| -1          |      +1     |          |          |          |                   |

### Activity 10: Fixing right-heavy trees using rotation combos

Record your answer here

### Activity 11: Fixing left-heavy trees

### 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?