      "def post_order_traversal(node, visit_func):\n",
      "    if node is not None:\n",
      "        post_order_traversal(node.left, visit_func)\n",
      "        post_order_traversal(node.right, visit_func)\n",
      "        visit_func(node.data)"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
 
</s> remove     "        visit_func(node.data)\n",
 </s> add     "        visit_func(node)\n", </s> remove     "        visit_func(node.data)\n",
 </s> add     "        visit_func(node)\n", </s> remove     "    visit_func(root.id)\n",
 </s> add     "    visit_func(root)\n", </s> remove     "        visit_func(node.data)\n",
 </s> add     "        visit_func(node)\n",
    "        visit_func(node)"
      "def post_order_traversal(node, visit_func):\n",
      "    if node is not None:\n",
      "        post_order_traversal(node.left, visit_func)\n",
      "        post_order_traversal(node.right, visit_func)\n",
    "        visit_func(node)"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
keep keep keep keep replace keep keep keep keep keep
 Simplified challenge coding and unit tests by working with the node directly as opposed to node.id or node.data, which is more natural when writing coding challenges. 
graphs_trees/tree_dfs/dfs_solution.ipynb