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.
/** * 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) { stack<TreeNode*> s; TreeNode *p = root, *pre = NULL; while(p || !s.empty()) { while(p) { if(pre) { pre->right = p; pre = NULL; } if(!p->left && !p->right) pre = p; s.push(p); p = p->left; } if(!s.empty()) { p = s.top(); s.pop(); p = p->right; } } for(p = root; p; p = p->right) { if(p->left) { p->right = p->left; p->left = NULL; } } } };