每日一题-二叉树展开为链表
2022.4.20
114. 二叉树展开为链表
给你二叉树的根结点 root
,请你将它展开为一个单链表:
展开后的单链表应该同样使用
TreeNode
,其中right
子指针指向链表中下一个结点,而左子指针始终为null
。展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 1:
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
题解:
这种父子节点关系转化的题目,一般的思路,是递归,递归的话需要将问题转化为一般性的子问题:对于某个节点root,需要对其左子树拉平,右子树拉平,再将右子树接到左子树的右下方,接好后的整个左子树接到root右下方
class Solution {
// 定义:将以 root 为根的树拉平为链表
void flatten(TreeNode root) {
// base case
if (root == null) return;
flatten(root.left);
flatten(root.right);
/**** 后序遍历位置 ****/
// 1、左右子树已经被拉平成一条链表
TreeNode left = root.left;
TreeNode right = root.right;
// 2、将左子树作为右子树
root.left = null;
root.right = left;
// 3、将原先的右子树接到当前右子树的末端
TreeNode p = root;
while (p.right != null) {
p = p.right;
}
p.right = right;
}
}