## trees and graphs
--- ### tree tranversals
* **breath-first search**: - similar to pre-order, but work with queue (level order problem) * **depth-first search**: * if the depth of the tree is too large, stack overflow might happen, therefore iterative solutions might be better. * work with stacks * **in-order**: * left -> node -> right * **pre-order** * node -> left -> right * top-down (parameters are passed down to children). * **post-order** * left -> right -> node * bottom-up solution (if you know the answer of the children, can you concatenate the answer of the nodes?): - deletion process is always post-order: when you delete a node, you will delete its left child and its right child before you delete the node itself. - also, post-order is used in mathematical expressions as it's easier to write a program to parse a post-order expression. using a stack, each time when you meet a operator, you can just pop 2 elements from the stack, calculate the result and push the result back into the stack.
--- ### `Tree.py`
```python > python3 Trees.py 🌴🌴🌴 Testing SimpleTree 🌴🌴🌴 a b d e c h g 🌳🌳🌳 Testing BinaryTree 🌳🌳🌳 🟡 Adding [4, 1, 4, 6, 7, 9, 10, 5, 11, 5] to the tree... 🟢 Printing the tree in preorder... 4 1 6 9 5 5 11 10 7 4 🟢 Searching for node 5: True ❌ Searching for node 15: False ❌ Is root a leaf? False 🟢 Is root full? True ❌ Is the tree balanced? False ❌ Is the tree a binary search tree? False 🎄🎄🎄 Testing BinarySearchTree 🎄🎄🎄 🟡 Adding [4, 1, 4, 6, 7, 9, 10, 5, 11, 5] to the tree... ❌ Item 4 not added as BSTs do not support repetition. ❌ Item 5 not added as BSTs do not support repetition. 🟢 Printing the tree in preorder: 4 1 6 5 7 9 10 11 🟢 Searching for node 5: True ❌ Searching for node 15: False ❌ Is root a leaf? False 🟢 Is root full? True 🟢 Largest node? 11 🟢 Smallest node? 1 ❌ Is the tree balanced? False 🟢 Is the tree a binary search tree? True ```
### `BinaryTree.py`
* a clean implementation adapted from the class above. ```python > python3 BinaryTree.py 🌳🌳🌳 Testing BinaryTree 🌳🌳🌳 🟡 Adding [4, 1, 4, 6, 7, 9, 10, 5, 11, 5] to the tree... 🟢 Print the tree preorder: [4, 1, 6, 9, 5, 5, 11, 10, 7, 4] 🟢 Print the tree inorder: [4, 1, 6, 9, 5, 5, 11, 10, 7, 4] 🟢 Print the tree postorder: [4, 1, 6, 9, 5, 5, 11, 10, 7, 4] 🟢 Search for node 5: True ❌ Search for node 15: False ```