1 Orginal problem:
Given a binary tree, flatten it to a linked list in-place.
For example,Given
1
/ \
2 5
/ \ \
3 4 6
The flattened tree should look like:
1
\
2
\
3
\
4
\
5
\
6
2 Solution
using post-order traverse of tree, you can solve it.
The code in C++ as follow:
/**
* 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==NULL ) return ;
flatten(root->left); //先处理左子树为链表,该语句返回时左子树已成链表
flatten(root->right);//再处理右子树为链表,该语句返回时右子树已成链表
//最后合并两个链表即可
TreeNode* tmp=root->right;//先备份一下右子树的根
root->right=root->left;//将左子树对应的链表链接在根的右子树上
TreeNode * tail=root;
for(;tail->right;tail=tail->right);//找到左子树链表的末尾
tail->right=tmp;//将其与右子树链表头链接
root->left=NULL;//最后不要忘了将左子树置空,如果没有这句,leetCode 将会提示“double free or corruption (fasttop): 0x0000000002785160 ***”的错误
}
};