Binary Tree Upside Down
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
递归
复杂度
O(N) 时间 O(N) 空间
思路
啥叫upsidedown?
a b
/ \ -----> / \
b c c a
upsidedown的意思就是把这三个node顺时针换一下位置。
整个树最后的顶点是原树最左的孩子。
假设递归来到了a为root的这一层(如上图左),a的左边返回了新的树根b,
注意此时b代表一个子树,c也代表一个子树
我们要把b扶持登基为根,然后c和a往哪放呢?b是一颗子树啊,人家已经有左右孩子了,容不下c和a了,分析题目给的例子,题意要把他们放到b的最右的孩子下面
把这个最右的孩子叫做rightMostNode,rightMostNode是个叶子节点没有左右孩子喔,于是我们把c拖家带口(带着他的孩子们)挂在rightMostNode的左边,把a诛九族后(为了避免形成cycle,我们只要a自己,把他的孩子(b和c)都去掉,即重新实例化一个a,左右孩子为Null)挂在他的右边,返回新的根(b的根)即可
注意
这题理解起来费劲
代码
public class Solution {
//返回新的树根
public TreeNode upsideDownBinaryTree(TreeNode root) {
if (root == null || root.left == null)
return root;
TreeNode newRoot = upsideDownBinaryTree(root.left);//新树根在最左
TreeNode rightMostIterator = newRoot;//找新根的最右,挂两个旋转得来的的孩子
while (rightMostIterator.right != null) {
rightMostIterator = rightMostIterator.right;
}
rightMostIterator.left = root.right;//原右孩子拖家带口投奔新根的左边
rightMostIterator.right = new TreeNode(root.val);//原root诛九族去右边
return newRoot;//返回新根
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。