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
Hints:
If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.
题目意思是把一个二叉树给拍扁,仔细观察下其实就是先序遍历,提示里也说了是先序遍历,最直观的可以相当先把先序遍历的结果存起来,再一个一个接到右边,但总感觉很low,可以直接先序遍历的时候进行操作,同样,如果要接的话肯定要用到额外的一个节点tail,先序遍历的时候每次把当前节点接到tail的右边,然后tail的左边置空,再把当前节点赋给tail。
class Solution {
public:
TreeNode* tail=NULL;//当前指针
void preorder(TreeNode*root)
{
if (root!=NULL)
{
TreeNode*left=root->left;
TreeNode*right = root->right;
if (tail==NULL)//根节点
{
tail = root;
}
else
{
tail->right = root;
tail->left = NULL;
tail = root;
}
preorder(left);
preorder(right);
}
}
void flatten(TreeNode* root) {
if (!root) return;
preorder(root);
}
};