题目描述
给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
算法思想
第一种:
先把左子树排好,然后将左子树加到根节点的右节点上,再把右子树接到排好的左子树上,最后对右子树进行排序。
第二种:
把左子树和右子树排好了,然后将左子树接到根节点的右节点上,再把右子树接到左子树后面。
Java代码
第一种:
public void flatten(TreeNode root) {
if (root == null) return;
flatten(root.left);
TreeNode left = root.left;
TreeNode right = root.right;
if (left != null) {
root.right = left;
while (left.right != null) left = left.right;
left.right = right;
root.left = null;
}
flatten(root.right);
}
第二种:
public void flatten(TreeNode root) {
if (root == null) return;
flatten(root.left);
flatten(root.right);
TreeNode left = root.left;
TreeNode right = root.right;
if (left != null) {
root.right = left;
while (left.right != null) left = left.right;
left.right = right;
root.left = null;
}
}