给你二叉树的根结点 root
,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用
TreeNode
,其中right
子指针指向链表中下一个结点,而左子指针始终为null
。 - 展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 1:
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
解题思路:
我们尝试给出这个函数的定义:
给 flatten
函数输入一个节点 root
,那么以 root
为根的二叉树就会被拉平为一条链表。
我们再梳理一下,如何按题目要求把一棵树拉平成一条链表?很简单,以下流程:
1、将 root
的左子树和右子树拉平。
2、将 root
的右子树接到左子树下方
3、然后将整个左子树作为右子树。
//定义:将以root为根的树拉平为链表
public void flatten(TreeNode root) {
if(root == null)
return;
flatten(root.left);
flatten(root.right);
//此时左右子树已经被拉平成一条链表
//找到左子树的最左叶子节点leftLeaf
TreeNode leftLeaf = root.left;
if(leftLeaf == null)
return;
while(leftLeaf.right != null){
leftLeaf = leftLeaf.right;
}
//将root的右子树接到左子树的下方
leftLeaf.right = root.right;
//最后将整个左子树作为右子树
root.right = root.left;
root.left = null;
}