Skip to content

Commit 95f8229

Browse files
committed
Added solution to see if the binary tree is symmetric about the given node
1 parent ef8cbbb commit 95f8229

File tree

1 file changed

+187
-0
lines changed

1 file changed

+187
-0
lines changed
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
package com.eprogrammerz.examples.algorithm.trees;
2+
3+
import org.junit.Test;
4+
5+
import java.util.ArrayList;
6+
import java.util.LinkedList;
7+
import java.util.List;
8+
import java.util.Queue;
9+
10+
import static org.junit.Assert.assertEquals;
11+
12+
/**
13+
* Find if tree is symmetric
14+
*/
15+
public class SymmetricBinaryTree {
16+
/**
17+
* This is naive solution using level order traversal
18+
*
19+
* if no node is present, add new node with Integer.MAX_VALUE and see if that particular level is symmetric
20+
*
21+
* @param A
22+
* @return
23+
*/
24+
public int isSymmetric(TreeNode A) {
25+
if (A == null) return 1;
26+
Queue<TreeNode> queue = new LinkedList<>();
27+
queue.add(A);
28+
29+
while(!queue.isEmpty()) {
30+
int size = queue.size();
31+
List<Integer> level = new ArrayList<>();
32+
for (int i = 0; i < size; i++) {
33+
34+
TreeNode node = queue.poll();
35+
level.add(node.val);
36+
37+
if (node.val != Integer.MAX_VALUE) {
38+
if (node.left != null) {
39+
queue.add(node.left);
40+
} else {
41+
queue.add(new TreeNode(Integer.MAX_VALUE));
42+
}
43+
44+
if (node.right != null) {
45+
queue.add(node.right);
46+
} else {
47+
queue.add(new TreeNode(Integer.MAX_VALUE));
48+
}
49+
}
50+
}
51+
52+
if (!isBalanced(level)) {
53+
return 0;
54+
}
55+
56+
}
57+
return 1;
58+
}
59+
60+
private boolean isBalanced(List<Integer> list) {
61+
if (list.size() == 1) return true;
62+
63+
if (list.size() % 2 != 0) return false;
64+
65+
for (int s = 0, e = list.size() - 1; s < e; s++, e--) {
66+
if (!list.get(s).equals(list.get(e))) {
67+
return false;
68+
}
69+
}
70+
return true;
71+
}
72+
73+
@Test
74+
public void testSymmetricTree() {
75+
/**
76+
* 1
77+
* / \
78+
* 2 2
79+
* / /
80+
* 3 3
81+
*/
82+
TreeNode root = new TreeNode(1);
83+
root.left = new TreeNode(2);
84+
root.left.left = new TreeNode(3);
85+
86+
root.right = new TreeNode(2);
87+
root.right.left = new TreeNode(3);
88+
assertEquals(0, isSymmetric(root));
89+
90+
/**
91+
* 9
92+
* / \
93+
* 10 10
94+
* / \ / \
95+
* 7 5 5 7
96+
* / \ \
97+
* 8 1 6
98+
* /
99+
* 2
100+
*
101+
* Min Depth = 3
102+
*/
103+
TreeNode root1 = new TreeNode(9);
104+
root1.right = new TreeNode(10);
105+
root1.left = new TreeNode(10);
106+
107+
root1.left.left = new TreeNode(7);
108+
root1.left.right = new TreeNode(5);
109+
root1.right.left = new TreeNode(5);
110+
root1.right.right = new TreeNode(7);
111+
112+
assertEquals(1, isSymmetric(root1));
113+
root1.left.right.right = new TreeNode(1);
114+
115+
root1.right.right.right = new TreeNode(6);
116+
root1.right.right.right.left = new TreeNode(2);
117+
118+
assertEquals(0, isSymmetric(root1));
119+
}
120+
121+
/**
122+
* Better solution with recursion
123+
*
124+
* @param root
125+
* @return
126+
*/
127+
int isSymmetricBetter(TreeNode root) {
128+
return isSymmetric(root, root) ? 1 : 0;
129+
}
130+
131+
private boolean isSymmetric(TreeNode node1, TreeNode node2) {
132+
if (node1 == null && node2 == null) return true;
133+
134+
if ((node1 == null) || (node2 == null) || node1.val != node2.val) return false;
135+
136+
return isSymmetric(node1.left, node2.right) && isSymmetric(node1.right, node2.left);
137+
}
138+
139+
140+
@Test
141+
public void testSymmetricBetterTree() {
142+
/**
143+
* 1
144+
* / \
145+
* 2 2
146+
* / /
147+
* 3 3
148+
*/
149+
TreeNode root = new TreeNode(1);
150+
root.left = new TreeNode(2);
151+
root.left.left = new TreeNode(3);
152+
153+
root.right = new TreeNode(2);
154+
root.right.left = new TreeNode(3);
155+
assertEquals(0, isSymmetricBetter(root));
156+
157+
/**
158+
* 9
159+
* / \
160+
* 10 10
161+
* / \ / \
162+
* 7 5 5 7
163+
* / \ \
164+
* 8 1 6
165+
* /
166+
* 2
167+
*
168+
* Min Depth = 3
169+
*/
170+
TreeNode root1 = new TreeNode(9);
171+
root1.right = new TreeNode(10);
172+
root1.left = new TreeNode(10);
173+
174+
root1.left.left = new TreeNode(7);
175+
root1.left.right = new TreeNode(5);
176+
root1.right.left = new TreeNode(5);
177+
root1.right.right = new TreeNode(7);
178+
179+
assertEquals(1, isSymmetricBetter(root1));
180+
root1.left.right.right = new TreeNode(1);
181+
182+
root1.right.right.right = new TreeNode(6);
183+
root1.right.right.right.left = new TreeNode(2);
184+
185+
assertEquals(0, isSymmetricBetter(root1));
186+
}
187+
}

0 commit comments

Comments
 (0)