leetcode 114. 二叉树展开为链表
问题描述
给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
非递归
首先找到根节点,如果左子节点存在,则首先把右子节点与根节点断开,右子节点连接左子节点的所有节点,原左子节点最后的右子节点连接原右子节点的所有节点。例子中的过程如下:
1
/ \
2 5
/ \ \
3 4 6
1
\
2
/ \
3 4
\
5
\
6
1
\
2
\
3
\
4
\
5
\
6
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void flatten(TreeNode* root) {
if(!root)return;
TreeNode *cur = root,*tmp = NULL;
while(cur)
{
if(cur->left)
{
tmp = cur->left;
while(tmp->right)tmp = tmp->right;
tmp->right = cur->right;
cur->right = cur->left;
cur->left = NULL;
}
cur = cur->right;
}
}
};
结果
执行用时:8 ms, 在所有 C++ 提交中击败了72.99%的用户
内存消耗:12 MB, 在所有 C++ 提交中击败了66.87%的用户
递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *last = NULL;
void flatten(TreeNode* root) {
if(!root)return;
if(root->right)flatten(root->right);
if(root->left)flatten(root->left);
root->right = last;
root->left = NULL;
last = root;
}
};
结果
执行用时:8 ms, 在所有 C++ 提交中击败了72.99%的用户
内存消耗:12.2 MB, 在所有 C++ 提交中击败了31.58%的用户