给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
思路
1,定义一数组,前序遍历保存数的所以节点,然后将数组转换为链表
2,迭代,当树不存在left节点时,树满足要求,当存在left节点时,我们将left节点转换成right节点,转换方法可以看代码
代码前序遍历+数组
struct TreeNode* array[2001];
int i;
// void put_array(struct TreeNode* r){
// if (r == NULL) {
// return;
// }
// array[i++] = r;
// put_array(r->left);
// put_array(r->right);
// }
//
// void flatten(struct TreeNode* root){
// memset(array, 0, sizeof(array));
// i = 0;
// put_array(root);
// int j = 0;
// while (array[j] != NULL) {
// array[j]->left = NULL;
// array[j]->right = array[j + 1];
// j++;
// }
// return;
// }
迭代
void flatten(struct TreeNode* root)
{
while(root)
{
if(root->left)
{
struct TreeNode * node = root->left;
while(node->right)
{
node = node->right;
}
node->right = root->right;
root->right = root->left;
root->left = NULL;
}
root = root->right;
}
}
时间空间复杂度



