156. Binary Tree Upside Down
- Total Accepted: 18225
- Total Submissions: 43407
- Difficulty: Medium
- Contributors: Admin
Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node that shares the same parent node) or empty, flip it upside down and turn it into a tree where the original right nodes turned into left leaf nodes. Return the new root.
For example:Given a binary tree
{1,2,3,4,5}
,1 / \ 2 3 / \ 4 5
return the root of the binary tree [4,5,2,#,#,3,1]
.
4 / \ 5 2 / \ 3 1
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
OJ's Binary Tree Serialization:
The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.
Here's an example:
1 / \ 2 3 / 4 \ 5The above binary tree is serialized as
"{1,2,3,#,#,4,#,#,5}"
.给定一棵树,这棵树的右节点有两种选择:1、空节点 2、叶子结点(左节点一定存在)
然后旋转该树(结构对称)且左节点变换为:1、空节点 2、叶子结点(右节点一定存在)
那么就可以用递归和非递归两种形式实现。
我选择了非递归的实现方法。
自顶向下:给定[1,2,3],变换为[2,3,1]依次从上向下变换即可。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode upsideDownBinaryTree(TreeNode root) { if (root == null || (root.left == null && root.right == null)){ return root; } TreeNode node = root; TreeNode nodeLeft = root.left; TreeNode nodeRight = root.right; while (nodeLeft != null){ TreeNode nodeChange = node; TreeNode nodeLeftChange = nodeLeft; TreeNode nodeRightChange = nodeRight; node = nodeLeft; nodeLeft = node.left; nodeRight = node.right; nodeLeftChange.left = nodeRightChange; nodeLeftChange.right = nodeChange; } root.left = null; root.right = null; return node; } }