一、题目描述:
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 1:
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [0]
输出:[0]
提示:
树中结点数在范围 [0, 2000] 内
-100 <= Node.val <= 100
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/flatten-binary-tree-to-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
对于任意一棵子树,根节点为root,通过flat这个递归方法展开为链表,并返回链表的尾部节点,具体过程如下:
如果根节点为null,或者是叶子节点,则它的尾节点为其自身。
否则,首先将左子树展开为链表,返回左子树链表的尾部节点tailLeft。然后将右子树展开为链表,返回右子树链表的尾部节点tailRight。
递归解法总体步骤:
- 严格按照递归函数定义
- 递归左右子树
- 从根节点遍历至最右下结点
- 最后拼接原来的右子树
三、AC 代码:
class Solution {
public void flatten(TreeNode root) {
if (root == null) {
return ;
}
// 后序遍历模板
flatten(root.left);
flatten(root.right);
TreeNode right = root.right;
TreeNode left = root.left;
root.left = null;
root.right = left;
// 遍历到最右下结点,拼接右子树
TreeNode p = root;
while (p.right != null) {
p = p.right;
}
p.right = right;
}
}