方法一:前序遍历(类似与Morris算法)
首先我们需要找出左边树的最右边的节点以便把右边树接过来。然后将新节点的左边树移到右边的树的位置上,再将原来右边树接到左边树上,直到新的右边树为null。
class Solution {
public void flatten(TreeNode root) {
while (root != null)
{
if(root.left == null)
{
root = root.right;
}
else
{
TreeNode pre = root.left;
while(pre.right != null)
{
pre = pre.right;
}
pre.right = root.right;
root.right = root.left;
root.left = null;
root = root.right;
}
}
}
}
方法二:前序遍历(递归)
class Solution {
public void flatten(TreeNode root) {
List<TreeNode> list = new ArrayList<TreeNode>();
Deque<TreeNode> stack = new LinkedList<TreeNode>();
TreeNode node = root;
while (node != null || !stack.isEmpty()) {
while (node != null) {
list.add(node);
stack.push(node);
node = node.left;
}
node = stack.pop();
node = node.right;
}
int size = list.size();
for (int i = 1; i < size; i++) {
TreeNode prev = list.get(i - 1), curr = list.get(i);
prev.left = null;
prev.right = curr;
}
}
}