Trees: Difference between revisions

From Wiki
Jump to navigation Jump to search
(Created page with "== Introduction == A '''tree''' is a hierarchical data structure that consists of nodes connected by edges. It is a non-linear data structure with a unique root node, and each node in the tree can have zero or more child nodes. The tree data structure is commonly used for representing hierarchies and searching efficiently in databases, file systems, and more. == Terminology == Here are some common terms used in the context of trees: * '''Node''': A basic unit in a tree...")
 
 
Line 79: Line 79:


int main() {
int main() {
BinaryTree tree;
    BinaryTree tree;
tree.insert(5);
    tree.insert(5);
tree.insert(3);
    tree.insert(3);
tree.insert(7);
    tree.insert(7);
tree.insert(2);
    tree.insert(2);
tree.insert(4);
    tree.insert(4);
tree.insert(6);
    tree.insert(6);
tree.insert(8);
    tree.insert(8);


// The tree now looks like this:
    // The tree now looks like this:
//      5
    //      5
//      / \
    //      / \
//    3  7
    //    3  7
//    / \ / \
    //    / \ / \
//  2  4 6  8
    //  2  4 6  8


return 0;
    return 0;
}


</pre>
</pre>

Latest revision as of 00:41, 13 May 2023

Introduction[edit]

A tree is a hierarchical data structure that consists of nodes connected by edges. It is a non-linear data structure with a unique root node, and each node in the tree can have zero or more child nodes. The tree data structure is commonly used for representing hierarchies and searching efficiently in databases, file systems, and more.

Terminology[edit]

Here are some common terms used in the context of trees:

  • Node: A basic unit in a tree that holds data and a reference to its children.
  • Root: The topmost node of the tree, which has no parent.
  • Child: A node that is directly connected to another node (its parent) in the tree.
  • Parent: A node that has one or more child nodes.
  • Leaf: A node with no children.
  • Siblings: Nodes that share the same parent.
  • Depth: The number of edges from the root to a node.
  • Height: The maximum depth of any node in the tree.

Types of Trees[edit]

There are several types of trees, including:

  • Binary Tree: A tree in which each node can have at most two children.
  • Binary Search Tree: A binary tree with the property that the value of each node is greater than or equal to the values of all the nodes in its left subtree and less than or equal to the values of all the nodes in its right subtree.
  • AVL Tree: A self-balancing binary search tree that ensures that the height of the tree remains logarithmic after each insertion or deletion operation.
  • Heap: A complete binary tree where each node's value is either greater than or equal to (in a max heap) or less than or equal to (in a min heap) the values of its children.
  • Trie: A tree-like data structure that is used to store a dynamic set or associative array, where the keys are usually strings.

Tree Traversals[edit]

There are several ways to traverse a tree, including:

  • Depth-First Search (DFS):
    • Pre-order Traversal: Visit the root, traverse the left subtree, and then traverse the right subtree.
    • In-order Traversal: Traverse the left subtree, visit the root, and then traverse the right subtree (used in binary search trees).
    • Post-order Traversal: Traverse the left subtree, traverse the right subtree, and then visit the root.
  • Breadth-First Search (BFS): Also known as level-order traversal, it visits all the nodes at the current depth before moving on to the nodes at the next depth.

C++ Example[edit]

Here's an example of a simple binary tree implementation in C++:

#include <iostream>

class Node {
public:
    int data;
    Node* left;
    Node* right;
};

class BinaryTree {
public:
    BinaryTree() : root(nullptr) {}

    void insert(int data) {
        if (root == nullptr) {
            root = new Node{data, nullptr, nullptr};
        } else {
            insert(root, data);
        }
    }

private:
    Node* root;

    void insert(Node* node, int data) {
        if (data < node->data) {
            if (node->left == nullptr) {
                node->left = new Node{data, nullptr, nullptr};
            } else {
                insert(node->left, data);
            }
        } else {
            if (node->right == nullptr) {
                node->right = new Node{data, nullptr, nullptr};
            } else {
                insert(node->right,
            data);
        }
    }
}

int main() {
    BinaryTree tree;
    tree.insert(5);
    tree.insert(3);
    tree.insert(7);
    tree.insert(2);
    tree.insert(4);
    tree.insert(6);
    tree.insert(8);

    // The tree now looks like this:
    //       5
    //      / \
    //     3   7
    //    / \ / \
    //   2  4 6  8

    return 0;
}

This simple binary tree example allows inserting values into the tree while maintaining the binary search tree property.

USACO Problems[edit]

Here are some USACO problems related to trees:

1. [USACO 2017 December Contest, Silver - Moocast](http://www.usaco.org/index.php?page=viewproblem2&cpid=668) 2. [USACO 2016 December Contest, Gold - Lasers and Mirrors](http://www.usaco.org/index.php?page=viewproblem2&cpid=670) 3. [USACO 2019 January Contest, Gold - Cow Land](http://www.usaco.org/index.php?page=viewproblem2&cpid=860)

See Also[edit]