​NC332 二叉树展开为单链表​

描述

给定一个节点个数为n的二叉树,请你把这个二叉树展开为一条单链表。

1.展开后的链表同样是TreeNode,其中right指针指向下一个节点,left节点为空

2.链表的顺序与给定二叉树的先序遍历顺序相同。

3.该题不需要返回链表或者树,请你在原树上面操作,系统会最后检查原树的情况来判断你的代码是否正确

4.该题有O(1)额外空间复杂度的解法,你能实现吗?传入的TreeNode不计入空间复杂度计算

例如:

原二叉树是

[链表]NC332 二叉树展开为单链表-简单_二叉树

展开后是

[链表]NC332 二叉树展开为单链表-简单_二叉树_02


数据范围:二叉树的节点数满足 [链表]NC332 二叉树展开为单链表-简单_二叉树_03 ,二叉树节点值满足 [链表]NC332 二叉树展开为单链表-简单_二叉树_04

示例1

输入:

{1,2,3,4,8}

复制

返回值:

{1,#,2,#,4,#,8,#,3}

复制

示例2

输入:

{0}

复制

返回值:

{0}

题解

非递归实现

我们可以很容易的想到使用递归方法先获取优先遍历的所有节点,然后再将这些节点串联起来。那么能不能在遍历的过程中就将这些节点按照先序遍历的顺序串联起来呢?答案是能,我们可以使用先序遍历的非递归实现,借助于栈,先将跟节点入栈,然后处理处理栈顶元素,并且将该元素的右节点、左节点按照顺序入栈,直到栈为空退出循环。

代码如下:

#include <bits/stdc++.h>

struct TreeNode
{

int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

class Solution
{
public:
void expandTree(TreeNode *root)
{
if (root == nullptr)
{
return;
}
TreeNode *node = nullptr;
std::stack<TreeNode *> s;
s.push(root);
while (!s.empty())
{
auto cur = s.top();
s.pop();

if (cur->right != nullptr)
{
s.push(cur->right);
}
if (cur->left != nullptr)
{
s.push(cur->left);
}

if (node == nullptr)
{
node = cur;
node->left = node->right = nullptr;
}
else
{
node->left = nullptr;
node->right = cur;
node = node->right;
}
}
}
};