-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBinaryTreeTraversal.java
169 lines (148 loc) · 5.21 KB
/
BinaryTreeTraversal.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
// this represents a tree node
class Node{
int data;
Node left;
Node right;
Node(int x){
this.data=x;
this.left=null;
this.right=null;
}
}
public class BinaryTreeTraversal {
// this represents a node of a linked list that is used to implement the queue
// Instead of making a queueNode linked list to implement a queue, we can simply use the Queue from Java Collections too. But, I am coding the queue here.
public class queueNode{
Node treeNode;
queueNode next;
queueNode(Node x){
this.treeNode=x;
this.next=null;
}
}
// following two belongs to linked list implementation of the queue
queueNode head;
queueNode tail;
// this belongs to the tree
Node root;
// enqueue operation of the queue using linked list implementation
// Time Complexity - O(1) , Space Complexity - O(1)
public void enqueue(Node n){
queueNode newNode = new queueNode(n);
if(head==null){
head = newNode;
tail = newNode;
return;
}
tail.next = newNode;
tail = newNode;
return;
}
// dequeue operation of queue using linked list implentation
// Time Complexity - O(1) , Space Complexity - O(1)
public void dequeue(){
if(head==null){
System.out.println("queue is already empty, can't dequeue");
return;
}
head = head.next;
return;
}
// can be used to traverse the queue
// Time Complexity - O(n) , Space Complexity - O(1)
public void traverseQueue(){
if(head==null){
System.out.println("queue is empty, can't traverse");
return;
}
queueNode temp = head;
while(temp!=null){
System.out.print(temp.treeNode.data+" ");
temp = temp.next;
}
System.out.println();
System.out.println();
}
// inorder Traversal of the tree - LEFT ROOT RIGHT
// Time Complexity - O(n) , Space Complexity - O(n) [As recursion uses internal stack]
public void inorderTraversal(Node temp){
if(temp==null){
return;
}
inorderTraversal(temp.left);
System.out.print(temp.data+" ");
inorderTraversal(temp.right);
}
// preorder traversal of the tree - ROOT LEFT RIGHT
// Time Complexity - O(n) , Space Complexity - O(n) [As recursion uses internal stack]
public void preorderTraversal(Node temp){
if(temp==null){
return;
}
System.out.print(temp.data+" ");
preorderTraversal(temp.left);
preorderTraversal(temp.right);
}
// postorder traversal of the tree - LEFT RIGHT ROOT
// Time Complexity - O(n) , Space Complexity - O(n) [As recursion uses internal stack]
public void postorderTraversal(Node temp){
if(temp==null){
return;
}
postorderTraversal(temp.left);
postorderTraversal(temp.right);
System.out.print(temp.data+" ");
}
// level order traversal of the tree - implemented by using queue
// Time Complexity - O(n) , Space Complexity - O(n)
public void levelOrderTraversal(Node temp){
if(temp==null){
return;
}
enqueue(temp); // first enqueue the root
// 5. repeat this process till queue becomes empty
while(head!=null){
System.out.print(head.treeNode.data+" "); //1. print first element of queue
if(head.treeNode.left!=null){ // 2. if left and right child are present for first element of queue, then add them to queue
enqueue(head.treeNode.left);
}
if(head.treeNode.right!=null){ // 3. if left and right child are present for first element of queue, then add them to queue
enqueue(head.treeNode.right);
}
dequeue(); // 4. dequeue the queue
}
}
public static void main(String[] args) throws Exception {
BinaryTreeTraversal tree = new BinaryTreeTraversal();
tree.root= new Node(20);
tree.root.left=new Node(100);
tree.root.left.left = new Node(50);
tree.root.left.right = new Node(15);
tree.root.left.left.left = new Node(222);
tree.root.right = new Node(3);
tree.root.right.left = new Node(250);
tree.root.right.right = new Node(35);
System.out.println("Inorder traversal ...");
tree.inorderTraversal(tree.root);
System.out.println();
System.out.println("Preorder traversal ...");
tree.preorderTraversal(tree.root);
System.out.println();
System.out.println("Postorder traversal ...");
tree.postorderTraversal(tree.root);
System.out.println();
System.out.println("Level order traversal ...");
tree.levelOrderTraversal(tree.root);
System.out.println();
}
}
/* ============================ OUTPUT ================================
Inorder traversal ...
222 50 100 15 20 250 3 35
Preorder traversal ...
20 100 50 222 15 3 250 35
Postorder traversal ...
222 50 15 100 250 35 3 20
Level order traversal ...
20 100 3 50 15 250 35 222
=======================================================================*/