方法1:
使用vector 保存遍历节点,空间复杂度O(n)
class Solution {
public:
void PreOrder(TreeNode* root,vector<TreeNode*> &vt)
{
if(root==NULL)
return ;
vt.push_back(root);
PreOrder(root->left,vt);
PreOrder(root->right,vt);
}
void flatten(TreeNode* root) {
if(!root)
return ;
vector<TreeNode*> vt;
PreOrder(root, vt);
for(int i=0;i<vt.size()-1;i++)
{
vt[i]->left=NULL;
vt[i]->right=vt[i+1];
}
}
};
方法2:
根据先序遍历,将当前节点的右子树连接到左子树的最右节点。无空间复杂度
class Solution {
public:
void flatten(TreeNode* root) {
if(!root)
return ;
TreeNode* now=root;
while(now)
{
if(now->left)
{
TreeNode* pre=now->left;
while(pre->right)
pre=pre->right;
pre->right=now->right;
now->right=now->left;
now->left=NULL;
}
now=now->right;
}
}
};