Total Accepted: 84864
Total Submissions: 270352
Difficulty: Medium
Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1 / \ 2 5 / \ \ 3 4 6The flattened tree should look like:
1 \ 2 \ 3 \ 4 \ 5 \ 6
Hints:
If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.
分析:
申请空间来记录前序遍历的结果,然后根据对应关系,建立链接,即碾平。
/**
* 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 dfs(vector<TreeNode*> &result,TreeNode* root)
{
if(root!=NULL){
result.push_back(root);
dfs(result,root->left);
dfs(result,root->right);
}
}
void flatten(TreeNode* root) {
if(root==NULL)
return;
vector<TreeNode*> result;//存在空间复杂度
dfs(result,root);//前序遍历
//碾平过程
for(int i=0;i<result.size()-1;i++)
{
result[i]->right=result[i+1];//建立连接
result[i]->left=NULL;
}
}
};
别人家的解法,无空间浮渣度:
class Solution {
public:
void flatten(TreeNode *root) {
TreeNode*now = root;
while (now)
{
if(now->left)
{
//Find current node's prenode that links to current node's right subtree
TreeNode* pre = now->left;
while(pre->right)
pre = pre->right;
pre->right = now->right;
//Use current node's left subtree to replace its right subtree(original right
//subtree is already linked by current node's prenode
now->right = now->left;
now->left = NULL;
}
now = now->right;
}
}
};
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/51647971
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895