题目链接
思路:
对每一棵子树来说,都是将其左子树连在根节点与右子树之间
选择后序遍历,先处理左子树和右子树,之后处理根节点
每一次将左子树连接完成之后,都需要将右子树连接在当前右子树的最右位置
举例:如下树
1
/ \
2 5
/ \ \
3 4 6
展开过程为:
处理节点3、4 处理节点2 处理节点5 处理节点1
1 1 1 1
/ \ / \ / \ \
2 5 -> 2 5 -> 2 5 -> 2
/ \ \ \ \ \ \ \
3 4 6 3 6 3 6 3
\ \ \
4 4 4
\
5
\
6
代码如下:
public void flatten(TreeNode root) {
if (root == null) {
return;
}
flatten(root.left);
flatten(root.right);
TreeNode tmp = root.right;
root.right = root.left;
root.left = null;
while (root.right != null) {
root = root.right;
}
root.right = tmp;
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
参考链接:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/comments/71016