- 描述
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
- 思路
观察其元素的顺序,显然是由前序遍历得到的,在确定遍历算法时,可以确定是前序遍历算法。在观察其展开后的树,发现只有右子树,显然可以这样:使用前序遍历算法遍历给定树,在遍历到一个节点时A,生成一个同样的节点B,B节点的右子树为A节点的左子数+A节点的右子树,由于逻辑相同,所以可以使用递归。代码见下 - 代码(c#)
public void Flatten(TreeNode root)
{
var h = Pre(root);//h即为结果
if (root != null) {
root.right = h.right;//使root的结构等于h
root.left = null;
}
}
public TreeNode Pre(TreeNode root)
{
TreeNode head = null;
if (root != null)
{
head = new TreeNode(root.val);
head.right = Pre(root.left);//遍历左子树
var h = head;
while (h.right != null)
{
h = h.right;
}
h.right = Pre(root.right);/将遍历左子树的结果加上遍历右子树的结果
}
return head;
}
- 相关链接
leetCode原题:https://leetcode.com/submissions/detail/144894079/