1+ package com .leetcode .trees ;
2+
3+ import java .util .Stack ;
4+
5+ import static org .junit .jupiter .api .Assertions .assertEquals ;
6+ import static org .junit .jupiter .api .Assertions .assertNull ;
7+
8+ /**
9+ * Level: Medium
10+ * Problem Link: https://leetcode.com/problems/binary-tree-upside-down/
11+ * Problem Description:
12+ * Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node that shares the
13+ * same parent node) or empty, flip it upside down and turn it into a tree where the original right nodes turned into
14+ * left leaf nodes. Return the new root.
15+ *
16+ * Example:
17+ * Input: [1,2,3,4,5]
18+ *
19+ * 1
20+ * / \
21+ * 2 3
22+ * / \
23+ * 4 5
24+ *
25+ * Output: return the root of the binary tree [4,5,2,#,#,3,1]
26+ *
27+ * 4
28+ * / \
29+ * 5 2
30+ * / \
31+ * 3 1
32+ *
33+ * Clarification:
34+ * Confused what [4,5,2,#,#,3,1] means? Read more below on how binary tree is serialized on OJ. The serialization of
35+ * a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.
36+ *
37+ * Here's an example:
38+ *
39+ * 1
40+ * / \
41+ * 2 3
42+ * /
43+ * 4
44+ * \
45+ * 5
46+ *
47+ * The above binary tree is serialized as [1,2,3,#,#,4,#,#,5].
48+ *
49+ * @author rampatra
50+ * @since 2019-08-04
51+ */
52+ public class BinaryTreeUpsideDown {
53+
54+ /**
55+ * The solution is simple, every node (except the root) on the left of the tree would have its parent's right child
56+ * as it's left child and parent as its right child. That's all you have to do to flip the tree upside down.
57+ *
58+ * Time Complexity: O(h)
59+ * Space Complexity: O(h)
60+ * where,
61+ * h = height of the tree
62+ *
63+ * Runtime: <a href="https://leetcode.com/submissions/detail/248816514/">1 ms</a>.
64+ *
65+ * @param root
66+ * @return
67+ */
68+ public static TreeNode upsideDownBinaryTreeUsingStack (TreeNode root ) {
69+ if (root == null ) return null ;
70+
71+ TreeNode curr = root ;
72+ TreeNode currParent ;
73+ TreeNode newRoot = null ;
74+
75+ // using stack to keep track of the parent node
76+ Stack <TreeNode > stack = new Stack <>();
77+
78+ while (curr != null ) {
79+ stack .add (curr );
80+ curr = curr .left ;
81+ }
82+
83+ while (!stack .empty ()) {
84+ curr = stack .pop ();
85+ currParent = stack .empty () ? null : stack .peek ();
86+
87+ if (newRoot == null ) newRoot = curr ;
88+
89+ if (currParent != null ) {
90+ curr .left = currParent .right ;
91+ curr .right = currParent ;
92+ } else {
93+ curr .left = null ;
94+ curr .right = null ;
95+ }
96+ }
97+
98+ return newRoot ;
99+ }
100+
101+ /**
102+ * The solution is simple, every node (except the root) on the left of the tree would have its parent's right child
103+ * as it's left child and parent as its right child. That's all you have to do to flip the tree upside down.
104+ *
105+ * Time Complexity: O(h)
106+ * Space Complexity: O(h)
107+ * where,
108+ * h = height of the tree
109+ *
110+ * Runtime: <a href="https://leetcode.com/submissions/detail/248821826/">0 ms</a>.
111+ *
112+ * @param node
113+ * @return
114+ */
115+ public static TreeNode upsideDownBinaryTree (TreeNode node ) {
116+ if (node == null || node .left == null ) return node ;
117+
118+ // go to the last node on the extreme left branch
119+ TreeNode newRoot = upsideDownBinaryTree (node .left );
120+
121+ // do the node changes as you backtrack
122+ node .left .left = node .right ;
123+ node .left .right = node ;
124+
125+ // clean up
126+ node .left = null ;
127+ node .right = null ;
128+
129+ return newRoot ;
130+ }
131+
132+ public static void main (String [] args ) {
133+ /*
134+ Binary Tree
135+
136+ 1
137+ / \
138+ 2 3
139+ / \
140+ 4 5
141+ */
142+ TreeNode tree = new TreeNode (1 );
143+ tree .left = new TreeNode (2 );
144+ tree .right = new TreeNode (3 );
145+ tree .left .left = new TreeNode (4 );
146+ tree .left .right = new TreeNode (5 );
147+
148+ /*
149+ Upside Down Binary Tree
150+
151+ 4
152+ / \
153+ 5 2
154+ / \
155+ 3 1
156+ */
157+ TreeNode upsideDownTree = upsideDownBinaryTreeUsingStack (tree );
158+ assertEquals (4 , upsideDownTree .val );
159+ assertEquals (5 , upsideDownTree .left .val );
160+ assertEquals (2 , upsideDownTree .right .val );
161+ assertEquals (1 , upsideDownTree .right .right .val );
162+ assertEquals (3 , upsideDownTree .right .left .val );
163+ assertNull (upsideDownTree .right .right .left );
164+ assertNull (upsideDownTree .right .right .right );
165+
166+
167+
168+ /******************************
169+ *
170+ * Test for the recursive method
171+ *
172+ ******************************/
173+
174+ /*
175+ Binary Tree
176+
177+ 1
178+ / \
179+ 2 3
180+ / \
181+ 4 5
182+ */
183+ tree = new TreeNode (1 );
184+ tree .left = new TreeNode (2 );
185+ tree .right = new TreeNode (3 );
186+ tree .left .left = new TreeNode (4 );
187+ tree .left .right = new TreeNode (5 );
188+
189+ /*
190+ Upside Down Binary Tree
191+
192+ 4
193+ / \
194+ 5 2
195+ / \
196+ 3 1
197+ */
198+ upsideDownTree = upsideDownBinaryTree (tree );
199+ assertEquals (4 , upsideDownTree .val );
200+ assertEquals (5 , upsideDownTree .left .val );
201+ assertEquals (2 , upsideDownTree .right .val );
202+ assertEquals (1 , upsideDownTree .right .right .val );
203+ assertEquals (3 , upsideDownTree .right .left .val );
204+ assertNull (upsideDownTree .right .right .right );
205+ assertNull (upsideDownTree .right .right .left );
206+ }
207+ }
0 commit comments