力扣114题:二叉树展开链表
题目描述
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
你可以使用原地算法(O(1)
额外空间)展开这棵树吗?
输入输出样例
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
输入:root = []
输出:[]
输入:root = [0]
输出:[0]
解法一:不考虑空间复杂度使用递归
void preOrderTraversal(TreeNode *root,vector<TreeNode*>&treeList)
{
if(!root)
{
return;
}
treeList.push_back(root);
preOrderTraversal(root->left,treeList);
preOrderTraversal(root->right,treeList);
}
//使用前序遍历实现
//对树进行前序遍历保存到临时的数组中,然后再将数组中的数据,重新写到另一颗树上去
void flatten2(TreeNode *&root)
{
vector<TreeNode*>treeList;
preOrderTraversal(root,treeList);
//获取结点数组的长度
int length=treeList.size();
//跳过根节点
for(int i=1;i<length;i++)
{
TreeNode *prev=treeList[i-1];
TreeNode*curr=treeList[i];
prev->right=curr;
prev->left=nullptr;
}
}