Flatten a binary tree to a fake "linked list" in pre-order traversal.
Here we use the right pointer in TreeNode as the next pointer in ListNode.
Example
Example 1:
Input:{1,2,5,3,4,#,6}
Output:{1,#,2,#,3,#,4,#,5,#,6}
Explanation:
1
/ \
2 5
/ \ \
3 4 6
1
\
2
\
3
\
4
\
5
\
6
Example 2:
Input:{1}
Output:{1}
Explanation:
1
1
Challenge
Do it in-place without any extra memory.
Notice
Don't forget to mark the left child of each node to null. Or you will get Time Limit Exceeded or Memory Limit Exceeded.
思路: divide and conquer;method return flatten first node;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public void flatten(TreeNode root) {
flattenHelper(root);
}
private TreeNode flattenHelper(TreeNode root) {
if(root == null) {
return null;
}
TreeNode leftnode = flattenHelper(root.left);
TreeNode rightnode = flattenHelper(root.right);
root.left = null;
if(leftnode != null) {
root.right = leftnode;
TreeNode rightmostNode = findRightMost(leftnode);
rightmostNode.right = rightnode;
}
return root;
}
private TreeNode findRightMost(TreeNode node) {
while(node != null && node.right != null) {
node = node.right;
}
return node;
}
}