Files
udemy_data_structures/Section_4/Binary Search Tree.ipynb
2019-05-01 22:08:49 -07:00

149 lines
4.5 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Binary Search Tree\n",
"**Constructor** sets three attributes: data, left subtree and right subtree. \n",
"**Insert** inserts a new subtree into the proper location. \n",
"**Find** finds a value. If value not found, returns False. \n",
"**Get_size** returns the number of nodes in the tree (excluding None nodes). \n",
"**Preorder** prints a preorder traversal of the tree. \n",
"**Inorder** prints an inorder traversal of the tree."
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [],
"source": [
"class Tree:\n",
" def __init__(self, data, left=None, right=None):\n",
" self.data = data\n",
" self.left = left\n",
" self.right = right\n",
" def insert(self, data):\n",
" if self.data == data:\n",
" return False # duplicate value\n",
" elif self.data > data:\n",
" if self.left is not None:\n",
" return self.left.insert(data)\n",
" else:\n",
" self.left = Tree(data)\n",
" return True\n",
" else:\n",
" if self.right is not None:\n",
" return self.right.insert(data)\n",
" else:\n",
" self.right = Tree(data)\n",
" return True\n",
" def find(self, data):\n",
" if self.data == data:\n",
" return data\n",
" elif self.data > data:\n",
" if self.left is None:\n",
" return False\n",
" else:\n",
" return self.left.find(data)\n",
" elif self.data < data:\n",
" if self.right is None:\n",
" return False\n",
" else:\n",
" return self.right.find(data)\n",
" def get_size(self):\n",
" if self.left is not None and self.right is not None:\n",
" return 1 + self.left.get_size() + self.right.get_size()\n",
" elif self.left:\n",
" return 1 + self.left.get_size()\n",
" elif self.right:\n",
" return 1 + self.right.get_size()\n",
" else:\n",
" return 1\n",
" def preorder(self):\n",
" if self is not None:\n",
" print (self.data, end=' ')\n",
" if self.left is not None:\n",
" self.left.preorder()\n",
" if self.right:\n",
" self.right.preorder()\n",
" def inorder(self):\n",
" if self is not None:\n",
" if self.left is not None:\n",
" self.left.inorder()\n",
" print (self.data, end=' ')\n",
" if self.right is not None:\n",
" self.right.inorder()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Test Code\n",
"We create a new tree, insert one value, insert a whole list of values, find all values from 1 to 15 (False for 0, 5 and 8 shows that those values are not in the tree), print the size of the tree, print preorder and postorder traversals."
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"False 1 2 3 4 False 6 7 False 9 10 11 12 13 14 15 \n",
" 13\n",
"7 2 1 3 6 4 9 15 10 12 11 13 14 \n",
"1 2 3 4 6 7 9 10 11 12 13 14 15 \n"
]
}
],
"source": [
"tree = Tree(7)\n",
"tree.insert(9)\n",
"for i in [15, 10, 2, 12, 3, 1, 13, 6, 11, 4, 14, 9]:\n",
" tree.insert(i)\n",
"for i in range(16):\n",
" print(tree.find(i), end=' ')\n",
"print('\\n', tree.get_size())\n",
"\n",
"tree.preorder()\n",
"print()\n",
"tree.inorder()\n",
"print()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}