Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1 / \ 2 5 / \ \ 3 4 6The 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.
分析:hints中告诉我们,树的右指针做了链表中的next指针,并且是先序遍历的顺序。因此先序遍历这棵二叉树,分递归和迭代方法。注意,迭代的时候,要保存树的右孩子,防止右孩子丢失。
代码:
递归方法:
/**
* 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) return ;
TreeNode *keepRight = root->right;//保存右孩子
if(previsit!=NULL){
previsit->left=NULL;
previsit->right=root;//会修改右孩子
}
previsit=root;//注意更新
flatten(root->left);
flatten(keepRight);
}
private:
TreeNode *previsit=NULL;//记录前一个访问的节点
};
迭代方法:
class Solution {
public:
//preorder 非递归方法
void flatten(TreeNode *root) {
if(!root) return ;
stack<TreeNode *> st;//辅助栈
st.push(root);
TreeNode *pre=0;//保存前一个节点
while(!st.empty()){
TreeNode *p=st.top();
st.pop();
if(p->right) st.push(p->right); //先右,栈的先进后出特性
if(p->left) st.push(p->left);
if(pre){
pre->right=p;
pre->left=NULL;
}
pre=p;
}
pre->left=0;//尾节点置0
pre->right=0;
}
};