void flattenInternal(TreeNode* root, vector<TreeNode*> &v) {
     if (root == null) return;
     v.push_back(root);
     if (root->left) {
         flatten2(root->left, v);
     }
     if (root->right) {
         flatten2(root->right, v);
     }
 }
 TreeNode *flatten2(TreeNode *root) {
     if(!root || (root->left == NULL && root->right == NULL)) return root;
     if(root->left == NULL) return flatten2(root->right);
     if(root->right == NULL) {
         root->right = root->left;
         root->left = NULL;
         return flatten2(root->right);
     }
     
     TreeNode *stleft = flatten2(root->left);
     TreeNode *stright = flatten2(root->right);
     stleft->right = root->right;
     root->right = root->left;
     root->left = NULL;
     return stright;
 }
 void flatten(TreeNode *root) {
     flatten2(root);
 }