From 5e9f00672ad28a3d433460a527639a4613a82631 Mon Sep 17 00:00:00 2001 From: Tait Hoyem Date: Sat, 13 Nov 2021 10:03:23 -0700 Subject: [PATCH] Tree program ready --- tree/README.md | 10 + tree/data.py | 23 + tree/requirements.txt | 1 + tree/tree.py | 1172 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1206 insertions(+) create mode 100644 tree/README.md create mode 100644 tree/data.py create mode 100644 tree/requirements.txt create mode 100644 tree/tree.py diff --git a/tree/README.md b/tree/README.md new file mode 100644 index 0000000..6cc7744 --- /dev/null +++ b/tree/README.md @@ -0,0 +1,10 @@ +# Trees + +To change the output of the tree, read the data.py file. + +Install one (optional) package: `bs4` (Beautiful Soup 4), with `pip install -r requirements.txt`. +This will make the output "pretty" (i.e. indented). + +To print the output to terminal, run `python tree.py` + +To save to a file, run `python tree.py file.html`. diff --git a/tree/data.py b/tree/data.py new file mode 100644 index 0000000..138ed87 --- /dev/null +++ b/tree/data.py @@ -0,0 +1,23 @@ +# used if you want to add links to the tree, or a node in the tree +ID = "t0" + +# example of tree (commented out) +''' +tree = [ + ("root", [ + ("child", [ + "grandchild", "grandchild" + ]), + ("child", []), + ]), +] +''' + +# every node is written ("value", []) +# the list inside contains all children of that node +# a string can also be used (i.e. "grandchildren"), but it can have no children + +# the tree you want converted to HTML, here: +tree = [ + ("root value", []) +] diff --git a/tree/requirements.txt b/tree/requirements.txt new file mode 100644 index 0000000..1315442 --- /dev/null +++ b/tree/requirements.txt @@ -0,0 +1 @@ +bs4 diff --git a/tree/tree.py b/tree/tree.py new file mode 100644 index 0000000..f40f859 --- /dev/null +++ b/tree/tree.py @@ -0,0 +1,1172 @@ +import sys +from data import tree, ID + +BEAUTIFUL_SOUP = False + +try: + from bs4 import BeautifulSoup as BS + BEAUTIFUL_SOUP = True +except ImportError: + pass + +FILENAME = "" +if len(sys.argv) >= 2: + FILENAME = sys.argv[1] + +""" +tree = [ + ("s", [ + ("a", [("b", [])]), + ("d", []), + ("c", [ + ("e", + [ + ("f", [("h", [])]), + ("g", [("i", [])]), + ] + )], + )]) +] +""" +""" +tree = [ + ("z (root, anscestor of a)", [ + ("y", [("x (leaf)", []), ("w (leaf)", [])]), + ("v (anscestor of a)", [("u (leaf)", [])]), + ("t (anscestor of a, parent of a)", + [("s (sibling of a, leaf)", []), ("r (sibling of a, leaf)", []), ("a (descendant of a, anscestor of a)", [ + ("q (child of a, desandant of a)", [ + ("o (decendant of a, leaf)", []), + ("n (decendant of a, leaf)", []), + ("m (decendant of a, leaf)", []), + ]), + ("p (child of a, desendant of a, leaf)" , []) + ])]), + ]) +] +""" +""" +tree = [ + ("4 (depth 0)", [ + ("1 (depth 1)", [ + ("0 (depth 2)", []), + ("0 (depth 2)", []), + ]), + ("3 (depth 1)", [ + ("2 (depth 2)", [ + ("1 (depth 3)", [ + ("0 (depth 4)", []), + ]), + ("0 (depth 3)", []), + ]), + ("0 (depth 2)", []), + ]), + ]) +] +""" +''' +tree = [ + ("no name", [ + ("1", [ + ("1", []), + ("2", []), + ]), + ("2", []), + ("3", [ + ("1", []), + ("2", []), + ("3", []), + ]), + ]) +] +''' + +''' +tree = [ + ("z", [ + ("v (subtree rooted at v)", [ + ("y (subtree rooted at v, left subtree of v)", [ + ("v (subtree rooted at v, left subtree of v", []), + ("u (subtree rooted at v, left subtree of v", []), + ]), + ("x (subtree rooted at v, right subtree of v)", [ + ("w (subtree rooted at v, right subtree of v)", []), + ]), + ]), + ("a", [("b", []), ("c", [])]), + ]) +] +''' + +''' +tree = [ + ("v (3)", [ + ("a (2)", [ + ("e (1)", [ + ("g (0)", []), + ("h (0)", []), + ]), + ("f (1)", [ + ("i (0)", []), + ]), + ]), + ("b (1)", [ + ("c (0)", []), + ("d (0)", []), + ]), + ]) +] +''' + +''' +tree = [ + ("A", [ + ("B", [ + ("D", []), + ("E", []), + ]), + ("C", [ + ("F", []), + ]), + ]) +] +''' + +''' +tree = [ + ("5", [("3", []), ("6", [])]) +] +tree = [ + ("5", [ + ("3", [ + ("2", []), + ("6", []), + ]), + ("8", []), + ]) +] + +tree = [ + ("5", [ + ("10 (right)", [ + ("20 (right)", [ + ("30 (right)", [ + ("25 (left)", []), + ]) + ]), + ]), + ]) +] + +tree = [ + ("5", []) +] + +tree = [ + ("500", [ + ("200", [ + ("100", []), + ("300", [ + ("250", []), + ("350", []), + ]), + ]), + ("700", [ + ("600", [ + ("650 (keys in this subtree would be >600 , <700)", []), + ("560", []), + ]), + ("800", []), + ]), + ]) +] +''' + +''' +tree = [ + ("3", [ + ("2", []), + ("8", [ + ("5", [ + ("4", []), + ("6", [ + ("7 (right)", []), + ]), + ]), + ("9", []), + ]), + ]) +] +''' + +''' +tree = [ + ("5", [ + ("8 (right)", [ + ("10 (right)", []), + ]), + ]) +] +''' + +''' +tree = [ + ("5", [ + ("2", [ + ("1", []), + ("3", []), + ]), + ("7", [ + ("6", []), + ("8", []), + ]), + ]) +] +''' + +''' +tree = [ + ("1", [ + ("2 (right)", [ + ("3 (right)", [ + ("4 (right)", [ + ("5 (right)", [ + ("6 (right)", [ + ("7 (right)", [ + ("8 (right)", []), + ]), + ]), + ]), + ]), + ]), + ]), + ]) +] +''' + +tree = [ + ("5", [ + ("3", [ + ("2 (left)", []), + ]), + ("8", [ + ("7", []), + ("9", []), + ]), + ]), +] + +''' +tree = [ + ("5", [ + ("3", [ + ("1 (left)", []), + ]), + ("10", []), + ]) +] +''' + +''' +tree = [ + ("5", [ + ("1", []), + ("10", []) + ]), +] +''' + +#tree = [("1", [])] + +''' +tree = [ + ("4", [ + ("2", []), + ("10", [ + ("7 (left)", [ + ("6", [ + ("5 (left)", []), + ]), + ("8", []), + ]), + ]), + ]), +] +''' + +''' +tree = [ + ("4", [ + ("2", []), + ("7", [ + ("6", [ + ("5 (left", []), + ]), + ("8", []), + ]), + ]), +] +''' + +''' +tree = [ + ("20", [ + ("6", [ + ("2", []), + ("10", [ + ("7", [ + ("8 (right)", []), + ]), + ("12", []), + ]), + ]), + ("...", []), + ]), +] +''' + +''' +tree = [ + ("30", [ + ("2", [ + ("1", []), + ("6", [ + ("...", []), + ("14", [ + ("11", [ + ("7", [ + ("9 (right)", [ + ("8", []), + ("10", []), + ]), + ]), + ("12", []), + ]), + ("...", []), + ]), + ]), + ]), + ("...", []), + ]) +] +''' + +''' +tree = [ + ("30", [ + ("2", [ + ("1", []), + ("7", [ + ("...", []), + ("14", [ + ("11", [ + ("9", [ + ("8", []), + ("10", []), + ]), + ("12", []), + ]), + ("...", []), + ]), + ]), + ]), + ("...", []), + ]), +] +''' + +''' +tree = [ + ("node", [ + ("node", [ + ("node", []), + ("node", []), + ]), + ("node", [ + ("node", []), + ("node", []), + ]), + ]), +] +''' + +''' +tree = [ + ("node", [ + ("node", [ + ("node", [ + ("...", [ + ("node", [ + ("node", [ + ]), + ]), + ]), + ]), + ]) + ]), +] +''' + +''' +tree = [ + ("node", [ + ("node", [ + ("node", [ + ("node", []), + ("node", []), + ]), + ("node", [ + ("node", []), + ("node", []), + ]), + ]), + ("node", [ + ("node", [ + ("node (right)", []), + ]), + ("node", [ + ("node", []), + ("node", []), + ]), + ]), + ]) +] +''' + +''' +tree = [ + ("node", [ + ("node (right)", [ + ("node (right)", [ + ("node (right)", [ + ("node (right)", []), + ]), + ]), + ]), + ]), +] +''' + +''' +tree = [ + ("1", [ + ("2", []), + ("2", []), + ]), +] +''' + +''' +tree = [ + ("5", [ + ("3", [ + ("2", []), + ("4", []), + ]), + ("7", [ + ("6 (left)", []), + ]), + ]), +] +''' + +''' +tree = [ + ("4", [ + ("2", [ + ("1", []), + ("3", []), + ]), + ("6", [ + ("5", []), + ("7", []), + ]), + ]), +] +''' + +""" +tree = [ + ("root node", [ + ("left subtree (7 nodes)", [ + ("node", [ + ("node", [ + ("node (left)", []), + ]), + ("node", []), + ]), + ("node", [ + ("node (left)", []), + ]), + ]), + ("right subtree (31 nodes)", [ + ("node", [ + ("node", [ + ("node", [ + ("node", []), + ("node", []), + ]), + ("node", [ + ("node", []), + ("node", []), + ]), + ]), + ("node", [ + ("node", [ + ("node", []), + ("node", []), + ]), + ("node", [ + ("node", []), + ("node", []), + ]), + ]), + ]), + ("node", [ + ("node", [ + ("node", [ + ("node", []), + ("node", []), + ]), + ("node", [ + ("node", []), + ("node", []), + ]), + ]), + ("node", [ + ("node", [ + ("node", []), + ("node", []), + ]), + ("node", [ + ("node", []), + ("node", []), + ]), + ]), + ]), + ]), + ]), +] +""" + +tree = [ + ("5", [ + ("3", [ + ("1", []), + ("4", []), + ]), + ("7", [ + ("6", []), + ("8", []), + ]), + ]), +] + +tree = [ + ("3", [ + ("1", []), + ("5", [ + ("4", []), + ("7", [ + ("6", []), + ("8", []), + ]), + ]), + ]), +] + +''' +tree = [ + ("v (root; h=k)", [ + ("u (h=k-1)", [ + ("left left (h=k-1)", [ + ("T1 (h=h-2)", [ + ("w", []), + ]), + ]), + ("T2 (h=k-2)", []), + ]), + ("T3 (h=k-2)", []), + ]), +] +''' + +''' +tree = [ + ("root", [ + ("left", [ + ("...", []), + ]), + ("right", [ + ("right left", [ + ("...", [ + ("w", []), + ]), + ]), + ("right right", [ + ("...", []), + ]), + ]), + ]), +] +''' +''' +tree = [ + ("v", [ + ("left", [ + ("left left", [ + ("...", []), + ]), + ("left right", [ + ("...", [ + ("w\\*", []), + ]), + ]), + ]), + ("right", [ + ("...", []), + ]), + ]), +] +''' + +''' +tree = [ + ("v (root)", [ + ("T1 (left; h=k-2)", []), + ("node (right; h=k)", [ + ("T2 (right left; h=k-2)", [ + ("w", []), + ]), + ("T3 (right right)", [ + ]), + ]), + ]), +] +''' + +''' +tree = [ + ("v (h=k)", [ + ("u (h=k-1)", [ + ("T1 (h=k-2)", []), + ("w (h=k-2)", [ + ("T2 (h=k-3)", [ + ("Insertion here or... one other place", []), + ]), + ("T3 (h=k-3)", [ + ("Other possible insertion place.", []), + ]), + ]), + ]), + ("T4 (h=k-2)", []), + ]), +] +''' + +''' +tree = [ + ("a", [ + ("c (h=k)", [ + ("b", [ + ("T1", []), + ("T2", [ + ("possible insertion", []), + ]), + ]), + ("T3 (h=k-3)", [("possible insertion (not part of height)", [])]), + ]), + ("T4 (h=k-2)", []), + ]), +] +''' + +''' +tree = [ + ("c", [ + ("b (h=k-1)", [ + ("T1 (h=k-2)", []), + ("T2 (h=k-2)", [ + ("possible insertion point", []), + ]), + ]), + ("a (h=k-1)", [ + ("T3 (h=k-2)", [ + ("possible insertion", []), + ]), + ("T4 (h=k-2)", []), + ]), + ]), +] +''' + +''' +tree = [ + ("X1", [ + ("...", []), + ("node", [ + ("p (left)", [ + ("X2 (arrow to X1)", [ + ("... (right)", []), + ]), + ]), + ]), + ]), +] +''' + +''' +tree = [ + ("root", [ + ("... (g; green)", [ + ("... (r; red)", [ + ("continues on with no detail", []), + ("o (orange)", [ + ("continues on with no detail", []), + ("node", [ + ("b (blue; left)", [ + ("continues on with no detail", []), + ("continues oN with no detail", []), + ]), + ]), + ]), + ]), + ("continues on with no detail", []), + ]), + ("continues on with no detail", []), + ]), +] +''' + +''' +tree = [ + ("node", [ + ("node", [ + ("...", []), + ("...", [ + ("5 (left)", []), + ]), + ]), + ("...", [ + ("14 (right; deleted)", []), + ]), + ]), +] +''' + +''' +tree = [ + ("1", [ + ("2", [ + ("4", [ + ("8", []), + ("9", []), + ]), + ("5", [ + ("10", []), + ("11", []), + ]), + ]), + ("3", [ + ("6", [ + ("12", []), + ("13", []), + ]), + ("7", [ + ("14", []), + ("15", []), + ]), + ]), + ]), +] +''' + +''' +tree = [ + ("1", [ + ("2", [ + ("4", [ + ("8", [ + "14", "15" + ]), + "9" + ]), + ("5", [ + ("10 (left)", [ + ("16 (left)", [ + "20", "21" + ]), + ]), + ]), + ]), + ("3", [ + ("6", [ + ("11", [ + "17", ("18", ["22 (right)"]) + ]), + "12" + ]), + ("7", [("13 (right)", ["19"])]), + ]), + ]), +] +''' + +''' +tree = [ + ("root", [ + "child (right)" + ]), +] +''' + +''' +tree = [ + ("root", [ + ("child", [ + ("grandchild", [ + ("great granchild", []), + ("great granchild", []), +]), + ("grandchild", [ + ("great granchild", []), + ("great granchild", []), + ]), + ]), + ("child", [ + ("grandchild", [ + ("great granchild", []), + ("great granchild", []), + ]), + ("grandchild", [ + ("great granchild", []), + ("great granchild", []), +]), + ]) + ]) +] +''' + +''' +tree = [ + ("...", [ + ("node at arbitrary depth", [ + "child node", + "child node" + ]), + ("node at arbitrary depth", [ + "child node", + "child node" + ]), + ("node at arbitrary depth", [ + "child node", + "child node", + ]), + ("node at arbitrary depth", [ + "child node (left)" + ]), + ]), +] +''' + +''' +tree = [ + ("1", [ + ("3 (highlighted arrow to 2)", [ + ("2", [ + ("7", []), + ]), + ("9", []), + ]), + ("6 (highlighted connection to 5)", [ + ("5", []), + ("8", []), + ]), + ]) +] +''' + +''' +tree = [ + ("root (complete tree)", [ + ("... (anbiguous number of node/depth)", [ + ("10", [ + ("12", ["..."]), + ("20", ["..."]) + ]) + ]), + ("... (anbiguous number of node/depth)", [ + ("11", [ + ("13", ["..."]), + ("19", ["..."]), + ]) + ]), + ]), +] +''' + +''' +tree = [ + ("root", [ + ("child", [ + ("grandchild", [ + "great grandchild", + "great grandchild", + ]), + ("grandchild", [ + "great grandchild", + "great grandchild", + ]), + ]), + ("child", [ + ("grandchild", [ + "inserted node" + ]), + ("grandchild", []), + ]), + ]), +] +''' + +''' +tree = [ + ("1", [ + ("2", [ + "..." + ]), + ("3", [ + ("6", [ + ("10 (left)", []), + ]), + ("8", []), + ]), + ]) +] +''' + +''' +tree = [ + ("?", [ + ("7", [ + ("10", []), + ("12", []), + ]), + ("6 (arrow towards root)", [ + ]), + ]), +] +''' + +''' +tree = [ + ("2", [ + ("4", [ + ("7", []), + ("8", []), + ]), + ("3", [ + ("5 (left)", []), + ]), + ]), +] +''' + +''' +tree = [ + ("0", [ + ("1", [ + ("3", [ + ("7", []), + ("8", []), + ]), + ("4", [ + ("9", []), + ("10", []), + ]), + ]), + ("2", [ + ("5", [ + ("11 (left)", []), + ]), + ("6", []), + ]), + ]), +] +''' + +''' +tree = [ + ("2", [ + ("7", [ + "8", "10" + ]), + ("6", [ + ("9", []), + ("1", []), + ]), + ]), +] +''' + +''' +tree = [ + ("1 (2 is crossed out, arrow to 2)", [ + ("7", [ + "8", "10" + ]), + ("2 (6 is crossed out, arrow to 6)", [ + "9", "6 (1 is crossed out)" + ]), + ]), +] +''' + +''' +tree = [ + ("7", [ + ("8", [ + "11", "10" + ]), + ("9", [ + ]), + ]), +] +''' + +''' +tree = [ + ("0", [ + ("1", [ + ("3", [ + ("7", [ + ("15", []), + ("16", []), + ]), + ("8", [ + ("17", []), + ("18", []), + ]), + ]), + ("4", [ + ("9 (label: last internal node)", [ + ("19", []), + ("20", []), + ]), + ("10", []), + ]), + ]), + ("2", [ + ("5", [ + ("11", []), + ("12", []), + ]), + ("6", [ + ("13", []), + ("14", []), + ]), + ]), + ]), +] +''' + +''' +tree = [ + ("1 (0; 10 is crossed out)", [ + ("2 (1; 9, 10 are crossed out; checkmark)", [ + ("3 (3; 10, 2, 7 are crossed out; checkmark))", [ + ("10 (3 is crossed out; checkmark)", []), + ("7 (2 is crossed out; checkmark)", []), + ]), + ("6 (4; 6, 1 are crossed out; checkmark)", [ + ("9 (left; 1,6 are crossed out)", []), + ]), + ]), + ("4 (2; 8 is crossed out; checkmark)", [ + ("5", []), + ("8 (4 is crossed out)", []), + ]), + ]), +] +''' + +''' +tree = [ + ("unlabled root", [ + ("unlabled child", []), + ("unlabled child", [ + ("unlabled grandchild", [ + ("unlabled great-grandchild", [ + ("unlabled great-great-grandchild", ["..."]), + ("unlabled great-great-grandchild", ["..."]) + ]), + ("unlabled great-grandchild", [ + ("unlabled great-great-grandchild", ["..."]), + ("unlabled great-great-grandchild", ["..."]) + ]), + ]), + ("unlabled grandchild", []), + ]), + ]), +] +''' + +''' +tree = [ + ("c", [ + ("a", ["..."]), + ("b", [ + ("d", ["..."]), + ("e", ["..."]), + ]), + ]), +] +''' + +''' +tree = [ + ("1", [ + "2 (left)" + ]), +]''' + +def _generate_tree(tup): + html = "" + html += "
  • " + if type(tup) == str: + html += "{0}
  • ".format(tup, ID, tup.split(" ")[0]) + return html + html += "{0}".format(tup[0], ID, tup[0].split(" ")[0]) + if len(tup[1]) > 0: + html += "" + html += "" + return html + +def generate_tree(treeobj): + html = "" + return html + +output = generate_tree(tree[0]) +final_output = "" + +if FILENAME != "": + final_output += "" + final_output += output + final_output += "" +else: + final_output += output + +if BEAUTIFUL_SOUP: + bs = BS(final_output, "html.parser") + final_output = bs.prettify() + +if FILENAME != "": + f = open(FILENAME, "w") + f.write(final_output) + f.close() +else: + print(final_output)