Skip to content

Instantly share code, notes, and snippets.

@YozhEzhi
Last active September 19, 2018 08:27
Show Gist options
  • Select an option

  • Save YozhEzhi/fa64b366f41d8f31f47357b6a95b41d2 to your computer and use it in GitHub Desktop.

Select an option

Save YozhEzhi/fa64b366f41d8f31f47357b6a95b41d2 to your computer and use it in GitHub Desktop.
Алгоритмы. Бинарные деревья.

http://btholt.github.io/four-semesters-of-cs/img/bst.png

Демо: https://codepen.io/YozhEzhi/pen/oPJggP

Trees cans be a useful structure for a middle ground between LinkedLists and ArrayLists. We're going to look a simple flavor of trees: the trusty binary search tree. The gist of the BST is that a node in a BST has zero, one, or two subtrees. Every element in the left subtree is lesser than the value of the node and every node in the right is greater. By being able to depend on this fact, it makes it very simple to add and find new elements. Like LinkedLists, we just have to change pointers when we add new elements. Let's step through an add.

Current Tree:

      10
    /   \
  5      15
 / \     /
3   8   12

-> .add is called with 7

-> start at root (10)

-> lesser than 10, go left to 5

-> greater than 5, go right to 8

-> lesser than 8, go left

-> no element at left, create new node and make it the left subtree of 8

         10
       /   \
     5      15
    / \     /
   3   8   12
      /
     7

BSTs get an average case of O(log n) on gets, adds, and deletes, but they can have a worst case of O(n) if you do something like add a sorted list to a BST. Go ahead, do a BST then add [1,2,3,4,5] to it.

1
 \
  2
   \
    3
     \
      4
       \
        5

Kind of a problem, right? Well, we'll address that in the next problem. BSTs do perform well so long as you stay away from their edge cases.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment