题目要求将一个二叉树展开为单链表,展开顺序遵循先序遍历。例如,给定如下二叉树:
按照先序遍历展开后,应得到如下单链表:
输入:root = [1,2,5,3,4,null,6] 输出:[1,null,2,null,3,null,4,null,5,null,6]
可以采用头插法。
采用头插法时,若要在6前插入5,5前插入4,依此类推,最终得到6、5、4、3、2、1的顺序,可按照以下步骤操作:首先遍历右子树,然后遍历左子树,将左子树置空。接着,使用头插法将根节点插入到链表头部,即执行root->right = head
操作。在下次头插前,需将当前根节点更新为新的链表头节点。
代码:
class Solution {
public:
TreeNode* head = nullptr;
void flatten(TreeNode* root) {
if (!root) return;
flatten(root->right);
flatten(root->left);
root->right = head;
root->left = nullptr;
head = root;
}
};
时间复杂度:O(n),n为树的节点数
空间复杂度:O(n),递归需要O(n)栈空间