Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 95f8229

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

File tree

Expand file treeCollapse file tree

1 file changed

+187
-0
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

1 file changed

+187
-0
lines changed
Open diff view settings
Collapse file
+187Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.