For example,
Given
1
/ \
2 5
/ \ \
3 4 6
The flattened tree should look like:
1
\
2
\
3
\
4
\
5
\
6
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public void flatten(TreeNode root) {
doFlatten(root);
}
private TreeNode doFlatten(TreeNode root) {
if(root==null) {
return null;
}
TreeNode tail = root;
while(true) {
if(tail.right!=null) {
tail = tail.right;
} else if(tail.left!=null) {
tail = tail.left;
} else {
break;
}
}
if(root.left==null && root.right!=null) {
doFlatten(root.right);
}
if(root.left!=null) {
TreeNode lTail = doFlatten(root.left);
TreeNode right = root.right;
doFlatten(root.right);
root.right = root.left;
root.left = null;
lTail.right = right;
}
return tail;
}
}
public void flatten(TreeNode root) { if (root == null) return; TreeNode left = root.left; TreeNode right = root.right; root.left = null; flatten(left); flatten(right); root.right = left; TreeNode cur = root; while (cur.right != null) cur = cur.right; cur.right = right; }
=====
public class Solution {
public void flatten(TreeNode root) {
Stack<TreeNode> stk = new Stack<TreeNode>();
if (root == null) {
return;
}
TreeNode pre = null;
stk.push(root);
while (!stk.isEmpty()) {
TreeNode node = stk.pop();
if (pre != null) {
pre.right = node;
pre.left = null;
}
pre = node;
if (node.right != null) {
stk.push(node.right);
}
if (node.left != null) {
stk.push(node.left);
}
}
}
}
=====
public class Solution {
public void flatten(TreeNode root) {
while (root != null) {
TreeNode oldLeft = root.left;
TreeNode oldRight = root.right;
root.left = null;
root.right = oldLeft;
TreeNode tail = oldLeft;
while (tail != null && tail.right != null) {
tail = tail.right;
}
if (tail != null) {
tail.right = oldRight;
} else {
root.right = oldRight;
}
root = root.right;
}
}
}
没有评论:
发表评论