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.
//利用前序遍历,保存上一个遍历的节点。
每次通过栈弹出一个node之后,修改left和right关系
一开始写的是将它们存入vector,那样遍历就没有难度了….
不过保存上一个节点的办法也不难~
class Solution {
public:
void flatten(TreeNode* root) {
if(!root) return;
//当前和前一个指针
TreeNode* pre=root;
stack<TreeNode* > Q;
Q.push(pre);
while(!Q.empty()){
TreeNode* node=Q.top();
Q.pop();
//更改指针关系,需要跳过根节点
if(node!=root){
pre->left=NULL;
pre->right=node;
}
pre=node;
if(node->right) Q.push(node->right);
if(node->left) Q.push(node->left);
}
// //进行中序遍历
// vector<TreeNode* > nodes;
// TreeNode* temp=root;
// stack<TreeNode* > Q;
// Q.push(temp);
// while(!Q.empty()){
// TreeNode* node=Q.top();
// Q.pop();
// nodes.push_back(node);
// if(node->right) Q.push(node->right);
// if(node->left) Q.push(node->left);
// }
// //至此,收集了一系列的nodes
// for(int i=0;i<nodes.size()-1;i++){
// nodes[i]->left=NULL;
// nodes[i]->right=nodes[i+1];
// }
}
};