题目:
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
思路:从上图可以看出,把二叉树精简成单链表之后,结点的left指针已经废弃了,只用left指针来作为next。这也是一道把二叉树树形结构进行序列化的过程,参考了http://blog.csdn.net/ojshilu/article/details/20646329 的思路,使用了last变量在递归中保存前序遍历的前驱结点。
注意一点:就是要把left指针全部清空为NULL才对!
/**
* Definition for binary tree
* 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;
TreeNode *last = NULL;
fun(root, last);
}
void fun(TreeNode *root, TreeNode* &last)
{
//提前获取左右孩子结点,因为一会要改变root
TreeNode *l = root->left;
TreeNode *r = root->right;
if(last != NULL)
{
last->right = root;
last->left = NULL;//别忘记清空left
}
last = root;
if(l != NULL)
fun(l, last);
if(r != NULL)
fun(r, last);
}
};
类似的问题还有:把一颗二叉排序树改造为一个有序的双向链表。