-
Notifications
You must be signed in to change notification settings - Fork 0
/
binaryTree1.java
136 lines (130 loc) · 4.3 KB
/
binaryTree1.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
import java.util.*;
import java.util.LinkedList;
public class binaryTree1 {
//Contructing a binary tree in preorder Time complexity = O(n)
//Node class
static class Node{
int data;
Node left;
Node right;
//contructor
Node(int data){
this.data = data;
this.left=null;
this.right = null;
}
}
//Binary tree class
static class BinaryTree{
static int index = -1; //index static coz we want index to update at every node in every recursion
//function to build tree
public static Node buildTree(int node[]){
index++;
if(node[index] == -1){
return null;
}
//make a new node at the index and use recursion to further build LST and RST (sub trees)
Node newNode = new Node(node[index]);
newNode.left = buildTree(node);
newNode.right = buildTree(node);
return newNode;
}
//TRAVERSAL in PREORDER time complexity = O(n)
public static void preorder(Node root){
if(root == null){
return;
}
System.out.print(root.data+" ");
preorder(root.left);
preorder(root.right);
}
//TRAVERSAL in INORDER time complexity = O(n)
public static void inorder(Node root){
if(root == null){
return;
}
inorder(root.left);
System.out.print(root.data+" ");
inorder(root.right);
}
//TRAVERSAL in POSTORDER time complexity = O(n)
public static void postorder(Node root){
if(root == null){
return;
}
postorder(root.left);
postorder(root.right);
System.out.print(root.data+ " ");
}
//TRAVERSAL in LEVEL ORDER time complexity = O(n)
public static void levelorder(Node root){
if(root == null){
return;
}
Queue<Node> q = new LinkedList<>();
q.add(root);
q.add(null); //tells compiler when new level starts
while(!q.isEmpty()){
Node currNode = q.remove();
if(currNode== null){
System.out.println();
if(q.isEmpty()){
break;
}else{
q.add(null);
}
}else{
System.out.print(currNode.data+" ");
if(currNode.left !=null){
q.add(currNode.left);
}
if(currNode.right !=null){
q.add(currNode.right);
}
}
}
}
//Height of the Tree Time complexity = O(n)
public static int height(Node root){
if(root==null){
return 0;
}
int lh = height(root.left);
int rh = height(root.right);
return Math.max(lh,rh)+1;
}
//Count number of nodes Time complexity = O(n)
public static int count(Node root){
if(root==null){
return 0;
}
int left_count = count(root.left);
int right_count = count(root.right);
return left_count+right_count +1;
}
//Sum of all nodes. Time complexity = O(n)
public static int sum(Node root){
if(root==null){
return 0;
}
int left_sum = sum(root.left);
int right_sum = sum(root.right);
return left_sum+right_sum + root.data;
}
}
public static void main(String[] args) {
int node[]={1,2,4,-1,-1,5,-1,-1,3,-1,6,-1,-1};
BinaryTree tree = new BinaryTree();
Node root = tree.buildTree(node);
tree.preorder(root);
System.out.println();
tree.inorder(root);
System.out.println();
tree.postorder(root);
System.out.println();
tree.levelorder(root);
System.out.println("Tree's height= "+ tree.height(root));
System.out.println("Number of nodes= "+ tree.count(root));
System.out.println("Sum of nodes= "+ tree.sum(root));
}
}