* fix: replace sh with shell fix replace terminal with shell fix replace node with js fix replace output with shell fix replace cs with csharp fix replace c++ with cpp fix replace c# with csharp fix replace javasctipt with js fix replace syntax with js fix replace unix with shell fix replace linux with shell fix replace java 8 with java fix replace swift4 with swift fix replace react.js with jsx fix replace javascriot with js fix replace javacsript with js fix replace c++ - with cpp fix: corrected various typos fix: replace Algorithm with nothing fix: replace xaml with xml fix: replace solidity with nothing fix: replace c++ with cpp fix: replace txt with shell fix: replace code with json and css fix: replace console with shell
		
			
				
	
	
		
			123 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | ||
| title: Trees
 | ||
| ---
 | ||
| # Trees
 | ||
| 
 | ||
| A tree data structure can be defined recursively (locally) as a collection of nodes (starting at a root node), where each node is a data structure consisting of a value, together with a list of references to nodes (the "children"), with the constraints that no reference is duplicated, and none points to the root. A tree with no nodes is called a null or empty tree.
 | ||
| 
 | ||
| A binary tree is a non linear data structure consisting nodes, where each node has the following 3 components:
 | ||
| 
 | ||
| **Data element**: Stores any kind of data in the node
 | ||
| **Left pointer**: Points to the sub-tree on the left side of node
 | ||
| **Right pointer**: Points to the sub-tree on the right side of the node
 | ||
| As the name suggests, the data element stores any kind of data in the node.
 | ||
| The left and right pointers point to binary trees on the left and right side of the node respectively.
 | ||
| 
 | ||
| If a tree is empty, it is represented by a null pointer.
 | ||
| 
 | ||
| ## Terminology used in trees:
 | ||
| 
 | ||
| **Root** :
 | ||
| The top node in a tree.
 | ||
| 
 | ||
| **Child**:
 | ||
| A node directly connected to another node when moving away from the Root.
 | ||
| 
 | ||
| **Parent**:
 | ||
| The converse notion of a child.
 | ||
| 
 | ||
| **Siblings**:
 | ||
| A group of nodes with the same parent.
 | ||
| 
 | ||
| **Descendant**:
 | ||
| A node reachable by repeated proceeding from parent to child.
 | ||
| 
 | ||
| **Ancestor**:
 | ||
| A node reachable by repeated proceeding from child to parent.
 | ||
| 
 | ||
| **Branch**(internal node):
 | ||
| A node of a tree that has child nodes.
 | ||
| 
 | ||
| **Leaf**(less commonly called External node):
 | ||
| A node with no children.
 | ||
| 
 | ||
| **Degree**:
 | ||
| The number of subtrees of a node.
 | ||
| 
 | ||
| **Edge**:
 | ||
| The connection between one node and another.
 | ||
| 
 | ||
| **Path**:
 | ||
| A sequence of nodes and edges connecting a node with a descendant.
 | ||
| 
 | ||
| **Level**:
 | ||
| The level of a node is defined by 1 + (the number of connections between the node and the root). 
 | ||
| 
 | ||
| **Height of tree**:
 | ||
| The height of a tree is the height of its root node.
 | ||
| 
 | ||
| **Depth**:
 | ||
| The depth of a node is the number of edges from the tree's root node to the node.
 | ||
| 
 | ||
| **Forest**:
 | ||
| A forest is a set of n ≥ 0 disjoint trees. 
 | ||
| 
 | ||
| ### Some Popular Types of Trees:
 | ||
| 
 | ||
| - **Binary Tree**. It has the following properties:
 | ||
|   - The maximum number of nodes at level ‘l’ of a binary tree is 2^l-1.
 | ||
|   - In Binary tree where every node has 0 or 2 children, number of leaf nodes is always one more than nodes with two children.
 | ||
| 
 | ||
| - **Binary Search Tree**. It has the following properties:
 | ||
|   - The left subtree of a node contains only nodes with keys lesser than the node’s key
 | ||
|   - The right subtree of a node contains only nodes with keys greater than the node’s key
 | ||
|   - The left and right subtree each must also be a binary search tree
 | ||
| 
 | ||
| - **AVL Tree**. It has the following properties:
 | ||
|   - Height difference of left and right subtree of node should be less than 2
 | ||
|   - Re-balancing is done when heights of two child subtrees of a node differ by more than one
 | ||
| 
 | ||
| * Red Black Tree
 | ||
| * Splay Tree
 | ||
| * Huffmann Tree
 | ||
| * M-Way Search Tree (used for huge amounts of data)
 | ||
| 
 | ||
| ### Common uses
 | ||
| 
 | ||
| * Representing hierarchical data
 | ||
| * Storing data in a way that makes it easily searchable
 | ||
| * Representing sorted lists of data
 | ||
| * Routing algorithms
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| ### Code of a tree node
 | ||
| 
 | ||
| ```cpp
 | ||
| struct node
 | ||
|     {
 | ||
|          int data;                 //Data element
 | ||
|          struct node * left;          //Pointer to left node
 | ||
|          struct node * right;         //Pointer to right node
 | ||
|     };
 | ||
| 
 | ||
| ```
 | ||
| ### Code for node creation
 | ||
| createNode() returns a new node with the given data and NULL left and right pointers.
 | ||
| 
 | ||
| ```cpp
 | ||
| struct node* newNode(int element) 
 | ||
| { 
 | ||
|   struct node* temp = (node*)malloc(sizeof(node));      //Allocate memeory for temp node
 | ||
|   temp->data = element;                                 // Assign element to temp 
 | ||
|   temp->left = NULL;                                    // Initialize left child as NULL 
 | ||
|   temp->right = NULL;                                   // Initialize right child as NULL
 | ||
|   return temp; 
 | ||
| } 
 | ||
| ```
 | ||
| 
 | ||
| #### More Information:
 | ||
| 
 | ||
| * [CMU lesson notes](http://www.cs.cmu.edu/~clo/www/CMU/DataStructures/Lessons/lesson4_1.htm)
 | ||
| * [Wikipedia](https://en.wikipedia.org/wiki/Tree_(data_structure))
 |