Update Tree-Traversal.md

pull/1224/head
Ramya Korupolu 2024-06-21 16:33:57 +05:30 zatwierdzone przez GitHub
rodzic 696714e842
commit 2d25b8ea41
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
1 zmienionych plików z 181 dodań i 0 usunięć

Wyświetl plik

@ -1 +1,182 @@
# Tree Traversal Algorithms
Tree Traversal refers to the process of visiting or accessing each node of the tree exactly once in a certain order. Tree traversal algorithms help us to visit and process all the nodes of the tree. Since tree is not a linear data structure, there are multiple nodes which we can visit after visiting a certain node. There are multiple tree traversal techniques which decide the order in which the nodes of the tree are to be visited.
A Tree Data Structure can be traversed in following ways:
- **Level Order Traversal or Breadth First Search or BFS**
- **Depth First Search or DFS**
- Inorder Traversal
- Preorder Traversal
- Postorder Traversal
## Binary Tree Structure
Before diving into traversal techniques, let's define a simple binary tree node structure:
```python
class Node:
def __init__(self, key):
self.leftChild = None
self.rightChild = None
self.data = key
# Main class
if __name__ == "__main__":
root = Node(1)
root.leftChild = Node(2)
root.rightChild = Node(3)
root.leftChild.leftChild = Node(4)
root.leftChild.rightChild = Node(5)
root.rightChild.leftChild = Node(6)
root.rightChild.rightChild = Node(6)
```
## Level Order Traversal
When the nodes of the tree are wrapped in a level-wise mode from left to right, then it represents the level order traversal. We can use a queue data structure to execute a level order traversal.
### Algorithm
- Create an empty queue Q
- Enqueue the root node of the tree to Q
- Loop while Q is not empty
- Dequeue a node from Q and visit it
- Enqueue the left child of the dequeued node if it exists
- Enqueue the right child of the dequeued node if it exists
### code for level order traversal in python
```python
def printLevelOrder(root):
if root is None:
return
# Create an empty queue
queue = []
# Enqueue Root and initialize height
queue.append(root)
while(len(queue) > 0):
# Print front of queue and
# remove it from queue
print(queue[0].data, end=" ")
node = queue.pop(0)
# Enqueue left child
if node.left is not None:
queue.append(node.left)
# Enqueue right child
if node.right is not None:
queue.append(node.right)
```
**output**
` Inorder traversal of binary tree is :
1 2 3 4 5 6 7 `
## Depth First Search
When we do a depth-first traversal, we travel in one direction up to the bottom first, then turn around and go the other way. There are three kinds of depth-first traversals.
## 1. Inorder Traversal
In this traversal method, the left subtree is visited first, then the root and later the right sub-tree. We should always remember that every node may represent a subtree itself.
`Note :` If a binary search tree is traversed in-order, the output will produce sorted key values in an ascending order.
**The order:** Left -> Root -> Right
### Algorithm
- Traverse the left subtree.
- Visit the root node.
- Traverse the right subtree.
### code for inorder traversal in python
```python
def printInorder(root):
if root:
# First recur on left child
printInorder(root.left)
# Then print the data of node
print(root.val, end=" "),
# Now recur on right child
printInorder(root.right)
```
**output**
` Inorder traversal of binary tree is :
4 2 5 1 6 3 7 `
## 2. Preorder Traversal
In this traversal method, the root node is visited first, then the left subtree and finally the right subtree.
**The order:** Root -> Left -> Right
### Algorithm
- Visit the root node.
- Traverse the left subtree.
- Traverse the right subtree.
### code for preorder traversal in python
```python
def printPreorder(root):
if root:
# First print the data of node
print(root.val, end=" "),
# Then recur on left child
printPreorder(root.left)
# Finally recur on right child
printPreorder(root.right)
```
**output**
` Inorder traversal of binary tree is :
1 2 4 5 3 6 7 `
## 3. Postorder Traversal
In this traversal method, the root node is visited last, hence the name. First we traverse the left subtree, then the right subtree and finally the root node.
**The order:** Left -> Right -> Root
### Algorithm
- Traverse the left subtree.
- Traverse the right subtree.
- Visit the root node.
### code for postorder traversal in python
```python
def printPostorder(root):
if root:
# First recur on left child
printPostorder(root.left)
# The recur on right child
printPostorder(root.right)
# Now print the data of node
print(root.val, end=" ")
```
**output**
` Inorder traversal of binary tree is :
4 5 2 6 7 3 1 `
## Complexity Analysis
- **Time Complexity:** All three tree traversal methods (Inorder, Preorder, and Postorder) have a time complexity of `𝑂(𝑛)`, where 𝑛 is the number of nodes in the tree.
- **Space Complexity:** The space complexity is influenced by the recursion stack. In the worst case, the depth of the recursion stack can go up to `𝑂()`, where is the height of the tree.