Given a binary tree, flatten it to a linked list in-place.
For example, given the following tree:
1
/
2 5
/ \
3 4 6
The flattened tree should look like:
1
2
3
4
5
6
大意:将二叉树展开为链表
方法:有两种展开的方法(DFS的题目都可以用递归和迭代的方法)
方法一(递归):
class Solution {
public:
void flatten(TreeNode* root) {
if(!root) return;
if(root->left) flatten(root->left);
if(root->right) flatten(root->right);
TreeNode *temp=root->right;
root->right=root->left;
root->left=NULL;//断开左结点,才能连上右结点
while(root->right) //返回上一个父节点,继续
root=root->right;
root->right=temp;
}
};
法二(迭代:本质是前序遍历(当然其他也行)):
class Solution {
public:
void flatten(TreeNode* root) {
if (!root) return;
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode *t = s.top(); s.pop();
if (t->left) {
TreeNode *r = t->left;
while (r->right) r = r->right;
r->right = t->right;
t->right = t->left;
t->left = NULL;
}
if (t->right) s.push(t->right);
}
}
};