一.递归
class Solution {
public:
TreeNode* inOrder(TreeNode* root){
if(root==NULL) return NULL;
else{
TreeNode* left = inOrder(root->left);
TreeNode* right = inOrder(root->right);
root->left = NULL;
root->right = left;
TreeNode *p = root;
while(p->right!=NULL) p = p->right;
p->right = right;
return root;
}
}
void flatten(TreeNode* root) {
inOrder(root);
}
};
二.循环
算法流程:
①若当前结点有左子树,将左孩子一直循环右结点插入到当前结点右结点
②否则一直循环右结点
class Solution {
public:
void flatten(TreeNode* root) {
while(root){
if(root->left){
TreeNode* p = root->left;
while(p->right) p = p->right;
p->right = root->right;
root->right = root->left;root->left=NULL;
}
root = root->right;
}
}
};