{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Search Trees\n",
    "\n",
    "In this reading, we'll learn about how to use trees as an efficient way to search for data.\n",
    "\n",
    "By the end, you should be comfortable with the following terms:\n",
    "* binary tree\n",
    "* search\n",
    "* range query\n",
    "* binary search tree\n",
    "* balanced tree\n",
    "\n",
    "formatting..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "IPython.OutputArea.prototype._should_scroll = function(lines) {\n",
       "    return false;\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%javascript\n",
    "IPython.OutputArea.prototype._should_scroll = function(lines) {\n",
    "    return false;\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "from graphviz import Graph, Digraph"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Binary Tree\n",
    "\n",
    "Below is a binary tree, cleaned up from last time.\n",
    "\n",
    "Remember that a tree is a directed graph.  It has one root node (that is, a node without a parent).  Every other node has a parent.  Nodes without children are called leaves.\n",
    "\n",
    "This tree is a *binary tree* because each node has at most two children."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"206pt\" height=\"218pt\"\n",
       " viewBox=\"0.00 0.00 206.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 202,-214 202,4 -4,4\"/>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"135\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"135\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39;&#45;&gt;&#39;B&#39; -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>&#39;A&#39;&#45;&gt;&#39;B&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M127.89,-174.21C122.78,-162.14 115.79,-145.64 109.97,-131.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"113.1,-130.31 105.98,-122.47 106.65,-133.04 113.1,-130.31\"/>\n",
       "<text text-anchor=\"middle\" x=\"123.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"171\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39;&#45;&gt;&#39;C&#39; -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>&#39;A&#39;&#45;&gt;&#39;C&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M142.11,-174.21C147.22,-162.14 154.21,-145.64 160.03,-131.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"163.35,-133.04 164.02,-122.47 156.9,-130.31 163.35,-133.04\"/>\n",
       "<text text-anchor=\"middle\" x=\"160\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;Y&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;Y&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;Y&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;Y&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;Y&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M86.13,-88.8C75.07,-75.75 58.96,-56.74 46.35,-41.85\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"48.89,-39.43 39.76,-34.06 43.55,-43.96 48.89,-39.43\"/>\n",
       "<text text-anchor=\"middle\" x=\"72.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;X&#39; -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>&#39;X&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;X&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;X&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;X&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;Z&#39; -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>&#39;Z&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"171\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;Z&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;Z&#39; -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;Z&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M171,-86.8C171,-75.16 171,-59.55 171,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"174.5,-46.18 171,-36.18 167.5,-46.18 174.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"176\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e0a0>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class Node:\n",
    "    def __init__(self, val):\n",
    "        self.val = val\n",
    "        self.left = None\n",
    "        self.right = None\n",
    "    \n",
    "    def to_graphviz(self, g=None):\n",
    "        if g == None:\n",
    "            g = Digraph()\n",
    "            \n",
    "        # draw self\n",
    "        g.node(repr(self.val))\n",
    "    \n",
    "        for label, child in [(\"L\", self.left), (\"R\", self.right)]:\n",
    "            if child != None:\n",
    "                # draw child, recursively\n",
    "                child.to_graphviz(g)\n",
    "                \n",
    "                # draw edge from self to child\n",
    "                g.edge(repr(self.val), repr(child.val), label=label)\n",
    "        return g\n",
    "    \n",
    "    def _repr_svg_(self):\n",
    "        return self.to_graphviz()._repr_image_svg_xml()\n",
    "    \n",
    "root = Node(\"A\")\n",
    "root.left = Node(\"B\")\n",
    "root.right = Node(\"C\")\n",
    "root.left.left = Node(\"Y\")\n",
    "root.left.right = Node(\"X\")\n",
    "root.right.right = Node(\"Z\")\n",
    "root"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Search\n",
    "\n",
    "What if we want to check whether a tree *contains* a value?  We know it does if one of the following is true:\n",
    "\n",
    "1. the root has that value\n",
    "2. the left subtree contains that value\n",
    "3. the right subtree contains that value\n",
    "\n",
    "Let's write a recursive function, `contains`, to do this search.  At each step, we'll display the subtree being searched."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "Is the root B?"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"206pt\" height=\"218pt\"\n",
       " viewBox=\"0.00 0.00 206.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 202,-214 202,4 -4,4\"/>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"135\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"135\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39;&#45;&gt;&#39;B&#39; -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>&#39;A&#39;&#45;&gt;&#39;B&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M127.89,-174.21C122.78,-162.14 115.79,-145.64 109.97,-131.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"113.1,-130.31 105.98,-122.47 106.65,-133.04 113.1,-130.31\"/>\n",
       "<text text-anchor=\"middle\" x=\"123.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"171\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39;&#45;&gt;&#39;C&#39; -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>&#39;A&#39;&#45;&gt;&#39;C&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M142.11,-174.21C147.22,-162.14 154.21,-145.64 160.03,-131.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"163.35,-133.04 164.02,-122.47 156.9,-130.31 163.35,-133.04\"/>\n",
       "<text text-anchor=\"middle\" x=\"160\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;Y&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;Y&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;Y&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;Y&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;Y&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M86.13,-88.8C75.07,-75.75 58.96,-56.74 46.35,-41.85\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"48.89,-39.43 39.76,-34.06 43.55,-43.96 48.89,-39.43\"/>\n",
       "<text text-anchor=\"middle\" x=\"72.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;X&#39; -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>&#39;X&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;X&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;X&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;X&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;Z&#39; -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>&#39;Z&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"171\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;Z&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;Z&#39; -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;Z&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M171,-86.8C171,-75.16 171,-59.55 171,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"174.5,-46.18 171,-36.18 167.5,-46.18 174.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"176\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e0a0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Is the root B?"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"134pt\" height=\"131pt\"\n",
       " viewBox=\"0.00 0.00 134.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 130,-127 130,4 -4,4\"/>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"63\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;Y&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;Y&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;Y&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;Y&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;Y&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-87.21C50.78,-75.14 43.79,-58.64 37.97,-44.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-43.31 33.98,-35.47 34.65,-46.04 41.1,-43.31\"/>\n",
       "<text text-anchor=\"middle\" x=\"52.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;X&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;X&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;X&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;X&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;X&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-87.21C75.22,-75.14 82.21,-58.64 88.03,-44.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-46.04 92.02,-35.47 84.9,-43.31 91.35,-46.04\"/>\n",
       "<text text-anchor=\"middle\" x=\"88\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e100>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.core.display import display, HTML\n",
    "\n",
    "def contains(node, target):\n",
    "    if node == None:\n",
    "        return False\n",
    "\n",
    "    display(HTML(\"Is the root %s?\" % target))\n",
    "    display(node)\n",
    "\n",
    "    if node.val == target:\n",
    "        return True\n",
    "    return contains(node.left, target) or contains(node.right, target)\n",
    "\n",
    "contains(root, \"B\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cool, we found the value in the second place we looked because we check left first.  What if the data is deep on the right side?  Worse, what if the thing we're searching for isn't even in the tree?  Let's try that:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "Is the root M?"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"206pt\" height=\"218pt\"\n",
       " viewBox=\"0.00 0.00 206.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 202,-214 202,4 -4,4\"/>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"135\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"135\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39;&#45;&gt;&#39;B&#39; -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>&#39;A&#39;&#45;&gt;&#39;B&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M127.89,-174.21C122.78,-162.14 115.79,-145.64 109.97,-131.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"113.1,-130.31 105.98,-122.47 106.65,-133.04 113.1,-130.31\"/>\n",
       "<text text-anchor=\"middle\" x=\"123.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"171\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39;&#45;&gt;&#39;C&#39; -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>&#39;A&#39;&#45;&gt;&#39;C&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M142.11,-174.21C147.22,-162.14 154.21,-145.64 160.03,-131.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"163.35,-133.04 164.02,-122.47 156.9,-130.31 163.35,-133.04\"/>\n",
       "<text text-anchor=\"middle\" x=\"160\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;Y&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;Y&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;Y&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;Y&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;Y&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M86.13,-88.8C75.07,-75.75 58.96,-56.74 46.35,-41.85\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"48.89,-39.43 39.76,-34.06 43.55,-43.96 48.89,-39.43\"/>\n",
       "<text text-anchor=\"middle\" x=\"72.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;X&#39; -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>&#39;X&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;X&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;X&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;X&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;Z&#39; -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>&#39;Z&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"171\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;Z&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;Z&#39; -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;Z&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M171,-86.8C171,-75.16 171,-59.55 171,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"174.5,-46.18 171,-36.18 167.5,-46.18 174.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"176\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e0a0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Is the root M?"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"134pt\" height=\"131pt\"\n",
       " viewBox=\"0.00 0.00 134.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 130,-127 130,4 -4,4\"/>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"63\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;Y&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;Y&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;Y&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;Y&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;Y&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-87.21C50.78,-75.14 43.79,-58.64 37.97,-44.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-43.31 33.98,-35.47 34.65,-46.04 41.1,-43.31\"/>\n",
       "<text text-anchor=\"middle\" x=\"52.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;X&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;X&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;X&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;X&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;X&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-87.21C75.22,-75.14 82.21,-58.64 88.03,-44.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-46.04 92.02,-35.47 84.9,-43.31 91.35,-46.04\"/>\n",
       "<text text-anchor=\"middle\" x=\"88\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e100>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Is the root M?"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"62pt\" height=\"44pt\"\n",
       " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\n",
       "<!-- &#39;Y&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;Y&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;Y&#39;</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e130>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Is the root M?"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"62pt\" height=\"44pt\"\n",
       " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\n",
       "<!-- &#39;X&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;X&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;X&#39;</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39ed60>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Is the root M?"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"62pt\" height=\"131pt\"\n",
       " viewBox=\"0.00 0.00 62.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 58,-127 58,4 -4,4\"/>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;Z&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;Z&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;Z&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;Z&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;Z&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e0d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Is the root M?"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"62pt\" height=\"44pt\"\n",
       " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\n",
       "<!-- &#39;Z&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;Z&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;Z&#39;</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39ef10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "contains(root, \"M\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Search Tree\n",
    "\n",
    "Ouch, that was slow.  It would be great if we could determine that an entry isn't in the tree without needing to look at every entry.\n",
    "\n",
    "One way we can guarantee this is if every value in a left subtree is less than the value of the parent and every value in the right subtree is greater than the value of the parent.\n",
    "\n",
    "## Constructing a Search Tree\n",
    "\n",
    "Let's create a function for adding values that guarantees this."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# TODO: make this a method...\n",
    "def add(node, val):\n",
    "    if node.val == val:\n",
    "        return # no duplicates\n",
    "    elif val < node.val:\n",
    "        if node.left != None:\n",
    "            add(node.left, val)\n",
    "        else:\n",
    "            node.left = Node(val)\n",
    "    else:\n",
    "        if node.right != None:\n",
    "            add(node.right, val)\n",
    "        else:\n",
    "            node.right = Node(val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"62pt\" height=\"44pt\"\n",
       " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e760>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "root = Node(\"C\")\n",
    "root"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"62pt\" height=\"131pt\"\n",
       " viewBox=\"0.00 0.00 62.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 58,-127 58,4 -4,4\"/>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;A&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;A&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"31.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e760>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "add(root, \"A\")\n",
    "root"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"62pt\" height=\"131pt\"\n",
       " viewBox=\"0.00 0.00 62.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 58,-127 58,4 -4,4\"/>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;A&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;A&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"31.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e760>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# duplicate shouldn't be added\n",
    "add(root, \"A\")\n",
    "root"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"62pt\" height=\"218pt\"\n",
       " viewBox=\"0.00 0.00 62.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 58,-214 58,4 -4,4\"/>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;A&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;A&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"31.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39;&#45;&gt;&#39;B&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;A&#39;&#45;&gt;&#39;B&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e760>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "add(root, \"B\")\n",
    "root"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"134pt\" height=\"218pt\"\n",
       " viewBox=\"0.00 0.00 134.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 130,-214 130,4 -4,4\"/>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"81\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"81\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;A&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;A&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M70.84,-175.01C62.92,-162.55 51.78,-145.01 42.72,-130.74\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"45.43,-128.48 37.11,-121.92 39.52,-132.23 45.43,-128.48\"/>\n",
       "<text text-anchor=\"middle\" x=\"62.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39; -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>&#39;E&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;E&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;E&#39; -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;E&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M84.64,-173.8C87.12,-162.09 90.46,-146.34 93.29,-132.97\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"96.78,-133.39 95.42,-122.89 89.93,-131.94 96.78,-133.39\"/>\n",
       "<text text-anchor=\"middle\" x=\"96\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39;&#45;&gt;&#39;B&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;A&#39;&#45;&gt;&#39;B&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e760>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "add(root, \"E\")\n",
    "root"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"134pt\" height=\"218pt\"\n",
       " viewBox=\"0.00 0.00 134.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 130,-214 130,4 -4,4\"/>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"63\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;A&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;A&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-174.21C50.78,-162.14 43.79,-145.64 37.97,-131.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-130.31 33.98,-122.47 34.65,-133.04 41.1,-130.31\"/>\n",
       "<text text-anchor=\"middle\" x=\"52.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39; -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>&#39;E&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;E&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;E&#39; -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;E&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-174.21C75.22,-162.14 82.21,-145.64 88.03,-131.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-133.04 92.02,-122.47 84.9,-130.31 91.35,-133.04\"/>\n",
       "<text text-anchor=\"middle\" x=\"88\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39;&#45;&gt;&#39;B&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;A&#39;&#45;&gt;&#39;B&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39; -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>&#39;D1&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D1&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39;&#45;&gt;&#39;D1&#39; -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>&#39;E&#39;&#45;&gt;&#39;D1&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"103.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e760>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "add(root, \"D1\")\n",
    "root"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"134pt\" height=\"305pt\"\n",
       " viewBox=\"0.00 0.00 134.00 305.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 301)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-301 130,-301 130,4 -4,4\"/>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"63\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;A&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;A&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-261.21C50.78,-249.14 43.79,-232.64 37.97,-218.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-217.31 33.98,-209.47 34.65,-220.04 41.1,-217.31\"/>\n",
       "<text text-anchor=\"middle\" x=\"51.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39; -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>&#39;E&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;E&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;E&#39; -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;E&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-261.21C75.22,-249.14 82.21,-232.64 88.03,-218.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-220.04 92.02,-209.47 84.9,-217.31 91.35,-220.04\"/>\n",
       "<text text-anchor=\"middle\" x=\"88\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39;&#45;&gt;&#39;B&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;A&#39;&#45;&gt;&#39;B&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39; -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>&#39;D1&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D1&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39;&#45;&gt;&#39;D1&#39; -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>&#39;E&#39;&#45;&gt;&#39;D1&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-173.8C99,-162.16 99,-146.55 99,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-133.18 99,-123.18 95.5,-133.18 102.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"103.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;D2&#39; -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>&#39;D2&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D2&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39;&#45;&gt;&#39;D2&#39; -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>&#39;D1&#39;&#45;&gt;&#39;D2&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e760>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "add(root, \"D2\")\n",
    "root"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"206pt\" height=\"305pt\"\n",
       " viewBox=\"0.00 0.00 206.00 305.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 301)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-301 202,-301 202,4 -4,4\"/>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"63\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;A&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;A&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-261.21C50.78,-249.14 43.79,-232.64 37.97,-218.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-217.31 33.98,-209.47 34.65,-220.04 41.1,-217.31\"/>\n",
       "<text text-anchor=\"middle\" x=\"52.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39; -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>&#39;E&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;E&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;E&#39; -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;E&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-261.21C75.22,-249.14 82.21,-232.64 88.03,-218.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-220.04 92.02,-209.47 84.9,-217.31 91.35,-220.04\"/>\n",
       "<text text-anchor=\"middle\" x=\"89\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39;&#45;&gt;&#39;B&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;A&#39;&#45;&gt;&#39;B&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39; -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>&#39;D1&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D1&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39;&#45;&gt;&#39;D1&#39; -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>&#39;E&#39;&#45;&gt;&#39;D1&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-173.8C99,-162.16 99,-146.55 99,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-133.18 99,-123.18 95.5,-133.18 102.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"103.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;F&#39; -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>&#39;F&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"171\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;F&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39;&#45;&gt;&#39;F&#39; -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>&#39;E&#39;&#45;&gt;&#39;F&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M111.87,-175.8C122.93,-162.75 139.04,-143.74 151.65,-128.85\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"154.45,-130.96 158.24,-121.06 149.11,-126.43 154.45,-130.96\"/>\n",
       "<text text-anchor=\"middle\" x=\"145\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;D2&#39; -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>&#39;D2&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D2&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39;&#45;&gt;&#39;D2&#39; -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>&#39;D1&#39;&#45;&gt;&#39;D2&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e760>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "add(root, \"F\")\n",
    "root"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Using a Search Tree\n",
    "\n",
    "Now that we've built a search tree, we can write a function for efficiently searching it.  It's like the previous `contains` function, but now we only need to check one child instead of checking both each time."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Is the root D2?'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"206pt\" height=\"305pt\"\n",
       " viewBox=\"0.00 0.00 206.00 305.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 301)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-301 202,-301 202,4 -4,4\"/>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"63\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;A&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;A&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-261.21C50.78,-249.14 43.79,-232.64 37.97,-218.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-217.31 33.98,-209.47 34.65,-220.04 41.1,-217.31\"/>\n",
       "<text text-anchor=\"middle\" x=\"52.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39; -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>&#39;E&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;E&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;E&#39; -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;E&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-261.21C75.22,-249.14 82.21,-232.64 88.03,-218.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-220.04 92.02,-209.47 84.9,-217.31 91.35,-220.04\"/>\n",
       "<text text-anchor=\"middle\" x=\"89\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39;&#45;&gt;&#39;B&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;A&#39;&#45;&gt;&#39;B&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39; -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>&#39;D1&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D1&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39;&#45;&gt;&#39;D1&#39; -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>&#39;E&#39;&#45;&gt;&#39;D1&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-173.8C99,-162.16 99,-146.55 99,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-133.18 99,-123.18 95.5,-133.18 102.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"103.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;F&#39; -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>&#39;F&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"171\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;F&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39;&#45;&gt;&#39;F&#39; -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>&#39;E&#39;&#45;&gt;&#39;F&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M111.87,-175.8C122.93,-162.75 139.04,-143.74 151.65,-128.85\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"154.45,-130.96 158.24,-121.06 149.11,-126.43 154.45,-130.96\"/>\n",
       "<text text-anchor=\"middle\" x=\"145\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;D2&#39; -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>&#39;D2&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D2&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39;&#45;&gt;&#39;D2&#39; -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>&#39;D1&#39;&#45;&gt;&#39;D2&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e760>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Go Right'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Is the root D2?'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"134pt\" height=\"218pt\"\n",
       " viewBox=\"0.00 0.00 134.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 130,-214 130,4 -4,4\"/>\n",
       "<!-- &#39;E&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;E&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"81\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"81\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;E&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;D1&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D1&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39;&#45;&gt;&#39;D1&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;E&#39;&#45;&gt;&#39;D1&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M70.84,-175.01C62.92,-162.55 51.78,-145.01 42.72,-130.74\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"45.43,-128.48 37.11,-121.92 39.52,-132.23 45.43,-128.48\"/>\n",
       "<text text-anchor=\"middle\" x=\"62.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;F&#39; -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>&#39;F&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;F&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39;&#45;&gt;&#39;F&#39; -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>&#39;E&#39;&#45;&gt;&#39;F&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M84.64,-173.8C87.12,-162.09 90.46,-146.34 93.29,-132.97\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"96.78,-133.39 95.42,-122.89 89.93,-131.94 96.78,-133.39\"/>\n",
       "<text text-anchor=\"middle\" x=\"96\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;D2&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;D2&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D2&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39;&#45;&gt;&#39;D2&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;D1&#39;&#45;&gt;&#39;D2&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39b220>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Go Left'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Is the root D2?'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"62pt\" height=\"131pt\"\n",
       " viewBox=\"0.00 0.00 62.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 58,-127 58,4 -4,4\"/>\n",
       "<!-- &#39;D1&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;D1&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D1&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;D2&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;D2&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D2&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39;&#45;&gt;&#39;D2&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;D1&#39;&#45;&gt;&#39;D2&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39aaf0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Go Right'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Is the root D2?'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"62pt\" height=\"44pt\"\n",
       " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\n",
       "<!-- &#39;D2&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;D2&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D2&#39;</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39ab20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def contains(node, target):\n",
    "    if node == None:\n",
    "        return False\n",
    "\n",
    "    display(\"Is the root %s?\" % target)\n",
    "    display(node)\n",
    "\n",
    "    if node.val == target:\n",
    "        return True\n",
    "    \n",
    "    if target < node.val:\n",
    "        display(\"Go Left\")\n",
    "        return contains(node.left, target)\n",
    "    else:\n",
    "        display(\"Go Right\")\n",
    "        return contains(node.right, target)\n",
    "\n",
    "contains(root, \"D2\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Range Query\n",
    "\n",
    "For the previous lookups, using a Python set would probably do about as well.  But what if we want get all the values in some range?\n",
    "\n",
    "We can write a similar function.  But now, we'll sometimes need to search both sides (depending on the width of the range).\n",
    "\n",
    "Rather than returning found values, we can accumulate everything in a list."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Is the root C between D1 and D9'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'NO'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"206pt\" height=\"305pt\"\n",
       " viewBox=\"0.00 0.00 206.00 305.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 301)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-301 202,-301 202,4 -4,4\"/>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"63\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;A&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;A&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-261.21C50.78,-249.14 43.79,-232.64 37.97,-218.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-217.31 33.98,-209.47 34.65,-220.04 41.1,-217.31\"/>\n",
       "<text text-anchor=\"middle\" x=\"52.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39; -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>&#39;E&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;E&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;E&#39; -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;E&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-261.21C75.22,-249.14 82.21,-232.64 88.03,-218.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-220.04 92.02,-209.47 84.9,-217.31 91.35,-220.04\"/>\n",
       "<text text-anchor=\"middle\" x=\"89\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39;&#45;&gt;&#39;B&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;A&#39;&#45;&gt;&#39;B&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39; -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>&#39;D1&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D1&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39;&#45;&gt;&#39;D1&#39; -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>&#39;E&#39;&#45;&gt;&#39;D1&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-173.8C99,-162.16 99,-146.55 99,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-133.18 99,-123.18 95.5,-133.18 102.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"103.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;F&#39; -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>&#39;F&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"171\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;F&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39;&#45;&gt;&#39;F&#39; -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>&#39;E&#39;&#45;&gt;&#39;F&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M111.87,-175.8C122.93,-162.75 139.04,-143.74 151.65,-128.85\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"154.45,-130.96 158.24,-121.06 149.11,-126.43 154.45,-130.96\"/>\n",
       "<text text-anchor=\"middle\" x=\"145\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;D2&#39; -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>&#39;D2&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D2&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39;&#45;&gt;&#39;D2&#39; -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>&#39;D1&#39;&#45;&gt;&#39;D2&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39e760>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Is the root E between D1 and D9'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'NO'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"134pt\" height=\"218pt\"\n",
       " viewBox=\"0.00 0.00 134.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 130,-214 130,4 -4,4\"/>\n",
       "<!-- &#39;E&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;E&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"81\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"81\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;E&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;D1&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D1&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39;&#45;&gt;&#39;D1&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;E&#39;&#45;&gt;&#39;D1&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M70.84,-175.01C62.92,-162.55 51.78,-145.01 42.72,-130.74\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"45.43,-128.48 37.11,-121.92 39.52,-132.23 45.43,-128.48\"/>\n",
       "<text text-anchor=\"middle\" x=\"62.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;F&#39; -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>&#39;F&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;F&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39;&#45;&gt;&#39;F&#39; -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>&#39;E&#39;&#45;&gt;&#39;F&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M84.64,-173.8C87.12,-162.09 90.46,-146.34 93.29,-132.97\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"96.78,-133.39 95.42,-122.89 89.93,-131.94 96.78,-133.39\"/>\n",
       "<text text-anchor=\"middle\" x=\"96\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;D2&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;D2&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D2&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39;&#45;&gt;&#39;D2&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;D1&#39;&#45;&gt;&#39;D2&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39b220>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Is the root D1 between D1 and D9'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'YES'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"62pt\" height=\"131pt\"\n",
       " viewBox=\"0.00 0.00 62.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 58,-127 58,4 -4,4\"/>\n",
       "<!-- &#39;D1&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;D1&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D1&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;D2&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;D2&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D2&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;D1&#39;&#45;&gt;&#39;D2&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;D1&#39;&#45;&gt;&#39;D2&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39aaf0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Is the root D2 between D1 and D9'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'YES'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"62pt\" height=\"44pt\"\n",
       " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\n",
       "<!-- &#39;D2&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;D2&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D2&#39;</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d39ab20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "['D1', 'D2']"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def range_query(node, lower, upper, results=None):\n",
    "    if results == None:\n",
    "        results = []\n",
    "\n",
    "    if node == None:\n",
    "        return results\n",
    "        \n",
    "    display(\"Is the root %s between %s and %s\" % (node.val, str(lower), str(upper)))\n",
    "    if lower <= node.val <= upper:\n",
    "        display(\"YES\")\n",
    "        results.append(node.val)\n",
    "    else:\n",
    "        display(\"NO\")\n",
    "        \n",
    "    display(node)\n",
    "\n",
    "    if lower < node.val:\n",
    "        range_query(node.left, lower, upper, results)\n",
    "    if upper > node.val:\n",
    "        range_query(node.right, lower, upper, results)\n",
    "\n",
    "    return results\n",
    "\n",
    "range_query(root, \"D1\", \"D9\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Balancing\n",
    "\n",
    "If the depth of all nodes are roughly equal, the time to check a values will be O(log N), which is pretty great!  But the insertion order matters a lot.  Let's consider these 8 numbers:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nums1 = list(range(20))\n",
    "nums1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[17, 9, 4, 18, 12, 7, 0, 6, 11, 15, 16, 3, 8, 1, 14, 19, 5, 10, 2, 13]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from numpy import random\n",
    "\n",
    "nums2 = nums1[:] # shallow copy\n",
    "random.seed(320)\n",
    "random.shuffle(nums2)\n",
    "nums2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "tree1 = Node(nums1[0])\n",
    "for num in nums1[1:]:\n",
    "    add(tree1, num)\n",
    "    \n",
    "tree2 = Node(nums2[0])\n",
    "for num in nums2[1:]:\n",
    "    add(tree2, num)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"62pt\" height=\"1697pt\"\n",
       " viewBox=\"0.00 0.00 62.00 1697.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 1693)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-1693 58,-1693 58,4 -4,4\"/>\n",
       "<!-- 0 -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>0</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1671\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-1667.3\" font-family=\"Times,serif\" font-size=\"14.00\">0</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>1</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1584\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-1580.3\" font-family=\"Times,serif\" font-size=\"14.00\">1</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;1 -->\n",
       "<g id=\"edge19\" class=\"edge\">\n",
       "<title>0&#45;&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-1652.8C27,-1641.16 27,-1625.55 27,-1612.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1612.18 27,-1602.18 23.5,-1612.18 30.5,-1612.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-1623.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>2</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1497\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-1493.3\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n",
       "</g>\n",
       "<!-- 1&#45;&gt;2 -->\n",
       "<g id=\"edge18\" class=\"edge\">\n",
       "<title>1&#45;&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-1565.8C27,-1554.16 27,-1538.55 27,-1525.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1525.18 27,-1515.18 23.5,-1525.18 30.5,-1525.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-1536.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>3</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1410\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-1406.3\" font-family=\"Times,serif\" font-size=\"14.00\">3</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;3 -->\n",
       "<g id=\"edge17\" class=\"edge\">\n",
       "<title>2&#45;&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-1478.8C27,-1467.16 27,-1451.55 27,-1438.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1438.18 27,-1428.18 23.5,-1438.18 30.5,-1438.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-1449.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>4</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1323\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-1319.3\" font-family=\"Times,serif\" font-size=\"14.00\">4</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;4 -->\n",
       "<g id=\"edge16\" class=\"edge\">\n",
       "<title>3&#45;&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-1391.8C27,-1380.16 27,-1364.55 27,-1351.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1351.18 27,-1341.18 23.5,-1351.18 30.5,-1351.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-1362.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 5 -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>5</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1236\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-1232.3\" font-family=\"Times,serif\" font-size=\"14.00\">5</text>\n",
       "</g>\n",
       "<!-- 4&#45;&gt;5 -->\n",
       "<g id=\"edge15\" class=\"edge\">\n",
       "<title>4&#45;&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-1304.8C27,-1293.16 27,-1277.55 27,-1264.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1264.18 27,-1254.18 23.5,-1264.18 30.5,-1264.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-1275.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 6 -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>6</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1149\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-1145.3\" font-family=\"Times,serif\" font-size=\"14.00\">6</text>\n",
       "</g>\n",
       "<!-- 5&#45;&gt;6 -->\n",
       "<g id=\"edge14\" class=\"edge\">\n",
       "<title>5&#45;&gt;6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-1217.8C27,-1206.16 27,-1190.55 27,-1177.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1177.18 27,-1167.18 23.5,-1177.18 30.5,-1177.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-1188.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 7 -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>7</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1062\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-1058.3\" font-family=\"Times,serif\" font-size=\"14.00\">7</text>\n",
       "</g>\n",
       "<!-- 6&#45;&gt;7 -->\n",
       "<g id=\"edge13\" class=\"edge\">\n",
       "<title>6&#45;&gt;7</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-1130.8C27,-1119.16 27,-1103.55 27,-1090.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1090.18 27,-1080.18 23.5,-1090.18 30.5,-1090.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-1101.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 8 -->\n",
       "<g id=\"node9\" class=\"node\">\n",
       "<title>8</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-975\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-971.3\" font-family=\"Times,serif\" font-size=\"14.00\">8</text>\n",
       "</g>\n",
       "<!-- 7&#45;&gt;8 -->\n",
       "<g id=\"edge12\" class=\"edge\">\n",
       "<title>7&#45;&gt;8</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-1043.8C27,-1032.16 27,-1016.55 27,-1003.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1003.18 27,-993.18 23.5,-1003.18 30.5,-1003.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-1014.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 9 -->\n",
       "<g id=\"node10\" class=\"node\">\n",
       "<title>9</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-888\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-884.3\" font-family=\"Times,serif\" font-size=\"14.00\">9</text>\n",
       "</g>\n",
       "<!-- 8&#45;&gt;9 -->\n",
       "<g id=\"edge11\" class=\"edge\">\n",
       "<title>8&#45;&gt;9</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-956.8C27,-945.16 27,-929.55 27,-916.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-916.18 27,-906.18 23.5,-916.18 30.5,-916.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-927.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 10 -->\n",
       "<g id=\"node11\" class=\"node\">\n",
       "<title>10</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-801\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-797.3\" font-family=\"Times,serif\" font-size=\"14.00\">10</text>\n",
       "</g>\n",
       "<!-- 9&#45;&gt;10 -->\n",
       "<g id=\"edge10\" class=\"edge\">\n",
       "<title>9&#45;&gt;10</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-869.8C27,-858.16 27,-842.55 27,-829.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-829.18 27,-819.18 23.5,-829.18 30.5,-829.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-840.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 11 -->\n",
       "<g id=\"node12\" class=\"node\">\n",
       "<title>11</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-714\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-710.3\" font-family=\"Times,serif\" font-size=\"14.00\">11</text>\n",
       "</g>\n",
       "<!-- 10&#45;&gt;11 -->\n",
       "<g id=\"edge9\" class=\"edge\">\n",
       "<title>10&#45;&gt;11</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-782.8C27,-771.16 27,-755.55 27,-742.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-742.18 27,-732.18 23.5,-742.18 30.5,-742.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-753.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 12 -->\n",
       "<g id=\"node13\" class=\"node\">\n",
       "<title>12</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-627\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-623.3\" font-family=\"Times,serif\" font-size=\"14.00\">12</text>\n",
       "</g>\n",
       "<!-- 11&#45;&gt;12 -->\n",
       "<g id=\"edge8\" class=\"edge\">\n",
       "<title>11&#45;&gt;12</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-695.8C27,-684.16 27,-668.55 27,-655.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-655.18 27,-645.18 23.5,-655.18 30.5,-655.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-666.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 13 -->\n",
       "<g id=\"node14\" class=\"node\">\n",
       "<title>13</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-540\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-536.3\" font-family=\"Times,serif\" font-size=\"14.00\">13</text>\n",
       "</g>\n",
       "<!-- 12&#45;&gt;13 -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>12&#45;&gt;13</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-608.8C27,-597.16 27,-581.55 27,-568.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-568.18 27,-558.18 23.5,-568.18 30.5,-568.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-579.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 14 -->\n",
       "<g id=\"node15\" class=\"node\">\n",
       "<title>14</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-453\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-449.3\" font-family=\"Times,serif\" font-size=\"14.00\">14</text>\n",
       "</g>\n",
       "<!-- 13&#45;&gt;14 -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>13&#45;&gt;14</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-521.8C27,-510.16 27,-494.55 27,-481.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-481.18 27,-471.18 23.5,-481.18 30.5,-481.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-492.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 15 -->\n",
       "<g id=\"node16\" class=\"node\">\n",
       "<title>15</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-366\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-362.3\" font-family=\"Times,serif\" font-size=\"14.00\">15</text>\n",
       "</g>\n",
       "<!-- 14&#45;&gt;15 -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>14&#45;&gt;15</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-434.8C27,-423.16 27,-407.55 27,-394.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-394.18 27,-384.18 23.5,-394.18 30.5,-394.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-405.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 16 -->\n",
       "<g id=\"node17\" class=\"node\">\n",
       "<title>16</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">16</text>\n",
       "</g>\n",
       "<!-- 15&#45;&gt;16 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>15&#45;&gt;16</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-347.8C27,-336.16 27,-320.55 27,-307.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-307.18 27,-297.18 23.5,-307.18 30.5,-307.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-318.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 17 -->\n",
       "<g id=\"node18\" class=\"node\">\n",
       "<title>17</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">17</text>\n",
       "</g>\n",
       "<!-- 16&#45;&gt;17 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>16&#45;&gt;17</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-260.8C27,-249.16 27,-233.55 27,-220.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-220.18 27,-210.18 23.5,-220.18 30.5,-220.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 18 -->\n",
       "<g id=\"node19\" class=\"node\">\n",
       "<title>18</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">18</text>\n",
       "</g>\n",
       "<!-- 17&#45;&gt;18 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>17&#45;&gt;18</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 19 -->\n",
       "<g id=\"node20\" class=\"node\">\n",
       "<title>19</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">19</text>\n",
       "</g>\n",
       "<!-- 18&#45;&gt;19 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>18&#45;&gt;19</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d7f5340>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# lookup with be very slow!\n",
    "tree1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"422pt\" height=\"566pt\"\n",
       " viewBox=\"0.00 0.00 422.00 566.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 562)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-562 418,-562 418,4 -4,4\"/>\n",
       "<!-- 17 -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>17</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"279\" cy=\"-540\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"279\" y=\"-536.3\" font-family=\"Times,serif\" font-size=\"14.00\">17</text>\n",
       "</g>\n",
       "<!-- 9 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>9</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"243\" cy=\"-453\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"243\" y=\"-449.3\" font-family=\"Times,serif\" font-size=\"14.00\">9</text>\n",
       "</g>\n",
       "<!-- 17&#45;&gt;9 -->\n",
       "<g id=\"edge17\" class=\"edge\">\n",
       "<title>17&#45;&gt;9</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M271.89,-522.21C266.78,-510.14 259.79,-493.64 253.97,-479.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"257.1,-478.31 249.98,-470.47 250.65,-481.04 257.1,-478.31\"/>\n",
       "<text text-anchor=\"middle\" x=\"267.5\" y=\"-492.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- 18 -->\n",
       "<g id=\"node19\" class=\"node\">\n",
       "<title>18</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"315\" cy=\"-453\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"315\" y=\"-449.3\" font-family=\"Times,serif\" font-size=\"14.00\">18</text>\n",
       "</g>\n",
       "<!-- 17&#45;&gt;18 -->\n",
       "<g id=\"edge19\" class=\"edge\">\n",
       "<title>17&#45;&gt;18</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M286.11,-522.21C291.22,-510.14 298.21,-493.64 304.03,-479.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"307.35,-481.04 308.02,-470.47 300.9,-478.31 307.35,-481.04\"/>\n",
       "<text text-anchor=\"middle\" x=\"304\" y=\"-492.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>4</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"162\" cy=\"-366\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"162\" y=\"-362.3\" font-family=\"Times,serif\" font-size=\"14.00\">4</text>\n",
       "</g>\n",
       "<!-- 9&#45;&gt;4 -->\n",
       "<g id=\"edge9\" class=\"edge\">\n",
       "<title>9&#45;&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M228.89,-437.19C216.23,-423.91 197.48,-404.23 183.04,-389.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"185.38,-386.46 175.95,-381.64 180.31,-391.29 185.38,-386.46\"/>\n",
       "<text text-anchor=\"middle\" x=\"212.5\" y=\"-405.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- 12 -->\n",
       "<g id=\"node12\" class=\"node\">\n",
       "<title>12</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"243\" cy=\"-366\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"243\" y=\"-362.3\" font-family=\"Times,serif\" font-size=\"14.00\">12</text>\n",
       "</g>\n",
       "<!-- 9&#45;&gt;12 -->\n",
       "<g id=\"edge16\" class=\"edge\">\n",
       "<title>9&#45;&gt;12</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M243,-434.8C243,-423.16 243,-407.55 243,-394.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"246.5,-394.18 243,-384.18 239.5,-394.18 246.5,-394.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"248\" y=\"-405.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 0 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>0</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"72\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"72\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">0</text>\n",
       "</g>\n",
       "<!-- 4&#45;&gt;0 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>4&#45;&gt;0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M147.14,-350.96C132.81,-337.43 110.93,-316.77 94.47,-301.22\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"96.56,-298.38 86.88,-294.06 91.75,-303.47 96.56,-298.38\"/>\n",
       "<text text-anchor=\"middle\" x=\"127.5\" y=\"-318.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- 7 -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>7</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"162\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"162\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">7</text>\n",
       "</g>\n",
       "<!-- 4&#45;&gt;7 -->\n",
       "<g id=\"edge8\" class=\"edge\">\n",
       "<title>4&#45;&gt;7</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M162,-347.8C162,-336.16 162,-320.55 162,-307.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"165.5,-307.18 162,-297.18 158.5,-307.18 165.5,-307.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"167\" y=\"-318.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>3</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">3</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;3 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>0&#45;&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M63.32,-261.61C56.85,-249.38 47.88,-232.44 40.48,-218.46\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"43.42,-216.54 35.65,-209.34 37.24,-219.81 43.42,-216.54\"/>\n",
       "<text text-anchor=\"middle\" x=\"58\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>1</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">1</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;1 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>3&#45;&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"31.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>2</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n",
       "</g>\n",
       "<!-- 1&#45;&gt;2 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>1&#45;&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 6 -->\n",
       "<g id=\"node9\" class=\"node\">\n",
       "<title>6</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">6</text>\n",
       "</g>\n",
       "<!-- 7&#45;&gt;6 -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>7&#45;&gt;6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M150.44,-262.41C140.94,-249.59 127.33,-231.22 116.49,-216.6\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"119.25,-214.44 110.48,-208.49 113.62,-218.61 119.25,-214.44\"/>\n",
       "<text text-anchor=\"middle\" x=\"139.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- 8 -->\n",
       "<g id=\"node11\" class=\"node\">\n",
       "<title>8</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"171\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">8</text>\n",
       "</g>\n",
       "<!-- 7&#45;&gt;8 -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>7&#45;&gt;8</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M163.82,-260.8C165.05,-249.16 166.71,-233.55 168.12,-220.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"171.61,-220.49 169.18,-210.18 164.65,-219.75 171.61,-220.49\"/>\n",
       "<text text-anchor=\"middle\" x=\"173\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 5 -->\n",
       "<g id=\"node10\" class=\"node\">\n",
       "<title>5</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">5</text>\n",
       "</g>\n",
       "<!-- 6&#45;&gt;5 -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>6&#45;&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-173.8C99,-162.16 99,-146.55 99,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-133.18 99,-123.18 95.5,-133.18 102.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"103.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- 11 -->\n",
       "<g id=\"node13\" class=\"node\">\n",
       "<title>11</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"243\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"243\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">11</text>\n",
       "</g>\n",
       "<!-- 12&#45;&gt;11 -->\n",
       "<g id=\"edge11\" class=\"edge\">\n",
       "<title>12&#45;&gt;11</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M243,-347.8C243,-336.16 243,-320.55 243,-307.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"246.5,-307.18 243,-297.18 239.5,-307.18 246.5,-307.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"247.5\" y=\"-318.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- 15 -->\n",
       "<g id=\"node15\" class=\"node\">\n",
       "<title>15</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"315\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"315\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">15</text>\n",
       "</g>\n",
       "<!-- 12&#45;&gt;15 -->\n",
       "<g id=\"edge15\" class=\"edge\">\n",
       "<title>12&#45;&gt;15</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M255.87,-349.8C266.93,-336.75 283.04,-317.74 295.65,-302.85\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"298.45,-304.96 302.24,-295.06 293.11,-300.43 298.45,-304.96\"/>\n",
       "<text text-anchor=\"middle\" x=\"288\" y=\"-318.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 10 -->\n",
       "<g id=\"node14\" class=\"node\">\n",
       "<title>10</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"243\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"243\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">10</text>\n",
       "</g>\n",
       "<!-- 11&#45;&gt;10 -->\n",
       "<g id=\"edge10\" class=\"edge\">\n",
       "<title>11&#45;&gt;10</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M243,-260.8C243,-249.16 243,-233.55 243,-220.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"246.5,-220.18 243,-210.18 239.5,-220.18 246.5,-220.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"247.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- 14 -->\n",
       "<g id=\"node16\" class=\"node\">\n",
       "<title>14</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"315\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"315\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">14</text>\n",
       "</g>\n",
       "<!-- 15&#45;&gt;14 -->\n",
       "<g id=\"edge13\" class=\"edge\">\n",
       "<title>15&#45;&gt;14</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M315,-260.8C315,-249.16 315,-233.55 315,-220.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"318.5,-220.18 315,-210.18 311.5,-220.18 318.5,-220.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"319.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- 16 -->\n",
       "<g id=\"node18\" class=\"node\">\n",
       "<title>16</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"387\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"387\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">16</text>\n",
       "</g>\n",
       "<!-- 15&#45;&gt;16 -->\n",
       "<g id=\"edge14\" class=\"edge\">\n",
       "<title>15&#45;&gt;16</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M327.87,-262.8C338.93,-249.75 355.04,-230.74 367.65,-215.85\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"370.45,-217.96 374.24,-208.06 365.11,-213.43 370.45,-217.96\"/>\n",
       "<text text-anchor=\"middle\" x=\"360\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- 13 -->\n",
       "<g id=\"node17\" class=\"node\">\n",
       "<title>13</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"315\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"315\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">13</text>\n",
       "</g>\n",
       "<!-- 14&#45;&gt;13 -->\n",
       "<g id=\"edge12\" class=\"edge\">\n",
       "<title>14&#45;&gt;13</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M315,-173.8C315,-162.16 315,-146.55 315,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"318.5,-133.18 315,-123.18 311.5,-133.18 318.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"319.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- 19 -->\n",
       "<g id=\"node20\" class=\"node\">\n",
       "<title>19</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"315\" cy=\"-366\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"315\" y=\"-362.3\" font-family=\"Times,serif\" font-size=\"14.00\">19</text>\n",
       "</g>\n",
       "<!-- 18&#45;&gt;19 -->\n",
       "<g id=\"edge18\" class=\"edge\">\n",
       "<title>18&#45;&gt;19</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M315,-434.8C315,-423.16 315,-407.55 315,-394.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"318.5,-394.18 315,-384.18 311.5,-394.18 318.5,-394.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"320\" y=\"-405.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17d3bc8e0>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# a bit better!\n",
    "tree2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Balance\n",
    "\n",
    "The second tree is definitely a lot more balanced than the first.  If we really want to measure this, we would like to identify openings that are shallower than the deepest nodes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 6)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def nearest_open(node):\n",
    "    if node is None:\n",
    "        return 0\n",
    "    return min(nearest_open(node.left), nearest_open(node.right)) + 1\n",
    "\n",
    "def max_depth(node):\n",
    "    if node is None or (node.left is None and node.right is None):\n",
    "        return 0\n",
    "    return 1 + max(max_depth(node.left), max_depth(node.right))\n",
    "\n",
    "nearest_open(tree2), max_depth(tree2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "def is_balanced(node):\n",
    "    return nearest_open(node) >= max_depth(node)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"134pt\" height=\"131pt\"\n",
       " viewBox=\"0.00 0.00 134.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 130,-127 130,4 -4,4\"/>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"63\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;A&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;A&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-87.21C50.78,-75.14 43.79,-58.64 37.97,-44.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-43.31 33.98,-35.47 34.65,-46.04 41.1,-43.31\"/>\n",
       "<text text-anchor=\"middle\" x=\"52.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;C&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;C&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-87.21C75.22,-75.14 82.21,-58.64 88.03,-44.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-46.04 92.02,-35.47 84.9,-43.31 91.35,-46.04\"/>\n",
       "<text text-anchor=\"middle\" x=\"88\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17e0a83a0>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# test is_balanced\n",
    "t = Node(\"B\")\n",
    "t.left = Node(\"A\")\n",
    "t.right = Node(\"C\")\n",
    "t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"134pt\" height=\"218pt\"\n",
       " viewBox=\"0.00 0.00 134.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 130,-214 130,4 -4,4\"/>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"53\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"53\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;A&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;A&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M47.86,-174.21C44.23,-162.33 39.29,-146.17 35.12,-132.56\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"38.4,-131.3 32.13,-122.76 31.7,-133.34 38.4,-131.3\"/>\n",
       "<text text-anchor=\"middle\" x=\"45.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;C&#39; -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;C&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M61.87,-174.61C68.53,-162.3 77.77,-145.23 85.37,-131.19\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"88.63,-132.51 90.31,-122.05 82.48,-129.18 88.63,-132.51\"/>\n",
       "<text text-anchor=\"middle\" x=\"83\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;D&#39; -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>&#39;D&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;D&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;D&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17e0a83a0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t.right.right = Node(\"D\")\n",
    "display(t)\n",
    "is_balanced(t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"134pt\" height=\"305pt\"\n",
       " viewBox=\"0.00 0.00 134.00 305.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 301)\">\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-301 130,-301 130,4 -4,4\"/>\n",
       "<!-- &#39;B&#39; -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>&#39;B&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"53\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"53\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;B&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;A&#39; -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>&#39;A&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;A&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;A&#39; -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;A&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M47.86,-261.21C44.23,-249.33 39.29,-233.17 35.12,-219.56\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"38.4,-218.3 32.13,-209.76 31.7,-220.34 38.4,-218.3\"/>\n",
       "<text text-anchor=\"middle\" x=\"45.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39; -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>&#39;C&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;C&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;B&#39;&#45;&gt;&#39;C&#39; -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>&#39;B&#39;&#45;&gt;&#39;C&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M61.87,-261.61C68.53,-249.3 77.77,-232.23 85.37,-218.19\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"88.63,-219.51 90.31,-209.05 82.48,-216.18 88.63,-219.51\"/>\n",
       "<text text-anchor=\"middle\" x=\"83\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;D&#39; -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>&#39;D&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;D&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;C&#39;&#45;&gt;&#39;D&#39; -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>&#39;C&#39;&#45;&gt;&#39;D&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-173.8C99,-162.16 99,-146.55 99,-133.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-133.18 99,-123.18 95.5,-133.18 102.5,-133.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"104\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "<!-- &#39;E&#39; -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>&#39;E&#39;</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">&#39;E&#39;</text>\n",
       "</g>\n",
       "<!-- &#39;D&#39;&#45;&gt;&#39;E&#39; -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>&#39;D&#39;&#45;&gt;&#39;E&#39;</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<__main__.Node at 0x7fd17e0a83a0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t.right.right.right = Node(\"E\")\n",
    "display(t)\n",
    "is_balanced(t)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Conclusion\n",
    "\n",
    "In this reading, we have seen that a binary tree is a BST (Binary Search Tree) if all the left descendents of a node have lesser values than the node, and all the right descendents have greater values.  Binary search trees allow us to find values and ranges of values without checking every node.\n",
    "\n",
    "In a perfectly balanced tree, looking for a single item is O(log N).  A tree if balanced if there are no nodes that could be moved closer to the root.\n",
    "\n",
    "Randomizing insertion order can improve balance.  There are also algorithms (not covered) to rearrange trees as values are inserted, maintaining balance (perhaps within some tolerance)."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
