-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBinaryTree.java
170 lines (134 loc) · 4.04 KB
/
BinaryTree.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
170
// Binary Tree (from scratch)
// preorder Traversal(root comes first)
// inorder Traversal(root comes middle)
// postorder Traversal(root comes last)
// lebelorder Traversal(print nodes in lebel)
// count nodes
// sum of nodes
// tree diameter (tree size - root value)
import java.util.*;
class BinaryTree {
private int count; // get total nodes
private int idx = -1; //idx means index and index = -1 refers that the root nodes have no child nodes
Node root;
class Node {
int data; //input type of nodes
Node left; // track left node
Node right; //track right node
// create a constructor
Node(int data) {
this.data = data;
this.left = null;
this.right = null;
count++;
}
}
// build tree
public Node buildTree(int nodes[]) {
idx++; //track the indexes
// check nodes index
if(nodes[idx] == -1) {
return null;
}
// create a new node
Node newNode = new Node(nodes[idx]);
// assign value in left and right node
newNode.left = buildTree(nodes);
newNode.right = buildTree(nodes);
return newNode;
}
// preorder
public void preorder(Node root) {
if(root == null) {
return;
}
// at first print root then print nodes left to right
System.out.print(root.data + " ");
preorder(root.left);
preorder(root.right);
}
// inorder
public void inorder(Node root) {
if(root == null) {
return;
}
// print left nodes then print root and then right node
inorder(root.left);
System.out.print(root.data + " ");
inorder(root.right);
}
// postorder
public void postorder(Node root) {
if(root == null) {
return;
}
// print nodes left to right and atlast print root
postorder(root.left);
postorder(root.right);
System.out.print(root.data + " ");
}
// lebelorder
public void lebelorder(Node root) {
if(root == null) {
return;
}
// create a LinkedList inbuilt java class
Queue<Node> q = new LinkedList<>();
q.add(root);
q.add(null);
while(!q.isEmpty()) {
Node currNode = q.remove();
if(currNode == null) {
System.out.print("\n");
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);
}
}
}
}
// get total nodes
public int getCount() {
return count;
}
public int sumofNodes(Node root) {
if(root == null) {
return 0;
}
int leftSum = sumofNodes(root.left);
int rightSum = sumofNodes(root.right);
return leftSum + rightSum + root.data;
}
}
class Firstclass {
public static void main(String args[]) {
BinaryTree tree = new BinaryTree();
int nodes[] = {1 , 2 , 4 , -1 , -1 , 5 , -1 , -1 , 3 , -1 , 6 , -1 , -1};
tree.root = tree.buildTree(nodes);
System.out.println(tree.root.data); //root value
tree.preorder(tree.root);
System.out.print("\n");
tree.inorder(tree.root);
System.out.print("\n");
tree.postorder(tree.root);
System.out.print("\n");
tree.lebelorder(tree.root);
System.out.print("\n");
System.out.print(tree.getCount());
System.out.print("\n");
System.out.print(tree.getCount() - 1); //diameter
System.out.print("\n");
System.out.print(tree.sumofNodes(tree.root));
}
}