"<small><i>This notebook was prepared by [Donne Martin](https://github.com/donnemartin). Source and license info is on [GitHub](https://github.com/donnemartin/interactive-coding-challenges).</i></small>"
]
},
{
"cell_type":"markdown",
"metadata":{},
"source":[
"# Solution Notebook"
]
},
{
"cell_type":"markdown",
"metadata":{},
"source":[
"## Problem: Check if a binary tree is balanced.\n",
"\n",
"* [Constraints](#Constraints)\n",
"* [Test Cases](#Test-Cases)\n",
"* [Algorithm](#Algorithm)\n",
"* [Code](#Code)\n",
"* [Unit Test](#Unit-Test)"
]
},
{
"cell_type":"markdown",
"metadata":{},
"source":[
"## Constraints\n",
"\n",
"* Is a balanced tree one where the heights of two sub trees of any node doesn't differ by more than 1?\n",
"The algorithm will be similar to where we get the height of a tree as seen in [here](http://nbviewer.ipython.org/github/donnemartin/interactive-coding-challenges/blob/master/graphs_trees/tree_height/height_solution.ipynb).\n",
"\n",
"However, we could check whether the tree is balanced while also checking for the heights.\n",
"* Recursively check whether the left sub tree is balanced, and get its maximum and minimum height\n",
"* Recursively Check whether the right sub tree is balanced, and get its maximum and minimum height\n",
"* Calculate the maximum height and minimum height of the current tree\n",
"* If both sub-trees are balanced, and the maximum and minimum height of the current tree doesn't differ by more than 1, then the current tree is balanced. Otherwise, it is not\n",
"* Return whether the current tree is balanced, and the maximum height and minimum height of the current tree\n",