Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1
/
2 5
/ \
3 4 6
The flattened tree should look like:
1
2
3
4
5
6
题意:用二叉树的右节点当做链表的next节点,把一个二叉树转换为链表的形式。
思路:
把二叉树转成一个链表的关键点是怎么把左子树连接在根节点和右子树中间。
假设左右子树已经分别转为链表了,那么如果知道了这个链表的头部和尾部,用根节点连接左子树链表的头部,再用左子树链表的尾部连接右子树链表的头部,就完成了二叉树到链表的转换。
因此可以用分治的方法解决这道题,先求左右子树转换成的链表,这个链表需要定义一个结构来标记头和尾,再把根节点和两个链表连接起来,返回给上一层连接后的链表结构。
分治的时候要注意左右子树为空的情况,不同的情况,头和尾指向哪里是不一样的。
class Result {
TreeNode head;
TreeNode tail;
}
public void flatten(TreeNode root) {
helper(root);
}
public Result helper(TreeNode root) {
if (root == null) {
return null;
}
//初始化当前链表的头尾
Result res = new Result();
res.head = root;
res.tail = root;
//求左右子树转换的链表
Result left = helper(root.left);
Result right = helper(root.right);
//不同情况下,连接根节点和左右链表,并更新当前链表尾部
if (left != null && right != null) {
root.right = left.head;
root.left = null;
left.tail.right = right.head;
res.tail = right.tail;
} else if (root.left != null) {
root.right = left.head;
root.left = null;
res.tail = left.tail;
} else if (root.right != null) {
root.right = right.head;
res.tail = right.tail;
}
return res;
}