# Homework 13 February 2022
1. **Construct Tree Hashmap from node list (children list)**:
Given a list of nodes, construct a php array (hash-map) using ID of the node as KEY.
**Input:**
```php
[
'nodes' => [
[
'children' => [
'B',
'C',
],
'id' => 'A',
'value' => 'A',
],
[
'children' => [
'D',
],
'id' => 'B',
'value' => 'B',
],
[
'children' => [
],
'id' => 'C',
'value' => 'C',
],
[
'children' => [
],
'id' => 'D',
'value' => 'D',
],
],
'startNode' => 'A',
]
```
**Output**:
```php
[
'nodes' => [
'A' => [
'children' => [
'B',
'C',
],
'id' => 'A',
'value' => 'A',
],
'B' => [
'children' => [
'D',
],
'id' => 'B',
'value' => 'B',
],
'C' => [
'children' => [
],
'id' => 'C',
'value' => 'C',
],
'D' => [
'children' => [
],
'id' => 'D',
'value' => 'D',
],
],
'startNode' => 'A',
]
```
2. **Construct Tree Hashmap from node list (parent reference)**:
Given a list of nodes, construct a php array (hash-map) using ID of the node as KEY. This data structure doesn't have children of nodes populated. Traverse the map and generate children of each node by the parent ID.
**Input:**
```php
[
'nodes' => [
[
'id' => 'A',
'value' => 'A',
'parent' => null,
],
[
'id' => 'B',
'value' => 'B',
'parent' => 'A',
],
[
'id' => 'C',
'value' => 'C',
'parent' => 'A',
],
[
'id' => 'D',
'value' => 'D',
'parent' => 'B',
],
],
'startNode' => 'A',
]
```
**Output:** Same as previous problem.
3. **Depth-first Search**:
Use the function implemented in *1* to construct Tree hashmap.
Given a Tree-like structure, stored in a flattened php array, Write a program to navigate the tree using *Depth-first Search* approach (left to right) and store the value of all nodes and print it.
***Input:***:
```php
[
'nodes' => [
[
'children' => [
'B',
'C',
'D',
],
'id' => 'A',
'value' => 'A',
],
[
'children' => [
'E',
'F',
],
'id' => 'B',
'value' => 'B',
],
[
'children' => [
],
'id' => 'C',
'value' => 'C',
],
[
'children' => [
'G',
'H',
],
'id' => 'D',
'value' => 'D',
],
[
'children' => [
],
'id' => 'E',
'value' => 'E',
],
[
'children' => [
'I',
'J',
],
'id' => 'F',
'value' => 'F',
],
[
'children' => [
'K',
],
'id' => 'G',
'value' => 'G',
],
[
'children' => [
],
'id' => 'H',
'value' => 'H',
],
[
'children' => [
],
'id' => 'I',
'value' => 'I',
],
[
'children' => [
],
'id' => 'J',
'value' => 'J',
],
[
'children' => [
],
'id' => 'K',
'value' => 'K',
],
],
'startNode' => 'A',
]
```
**Output:**
```php
["A", "B", "E", "F", "I", "J", "C", "D", "G", "K", "H"]
```
4. **Breadth-first Search**:
Use the function implemented in *1* to construct Tree hashmap.
Given a Tree-like structure, stored in a flattened php array, Write a program to navigate the tree using *Breadth-first Search* approach (left to right) and store the value of all nodes and print it.
**Input**: Same as Depth-first Search.
**Output**:
```php
["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]
```
5. **Tic Tac Toe**:
Try to improve your previous implementation of tic tac toe. Ex: Optimizing check winner functions as discussed.
6. **Tic Tac Toe VS AI**:
Building upon the previous two player implementation. Implement a Player VS Computer Game. Your main goal is to conceive and implement the algorithm for computer player to place his marker on most likely place to win. Hint: Start by placing randomly, then actually work on finding winning algorithms.
7. **Optimized Fibonacci (Dynamic Programming)**:
Implement a recursive function to output N-th number of fibonacci sequence. Now Optimize it by applying the basic concept of dynamic programming. Ex: Saving result for a N input in a hashmap and retrieving it instead of recalculating again.