{ "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 }