详细思路
class Solution { public: TreeNode*node1,*node2,*pre; void recoverTree(TreeNode* root) { dfs(root); int temp=node1->val; node1->val=node2->val; node2->val=temp; return; } void dfs(TreeNode*root){ if(!root)return ; dfs(root->left); if(pre&&pre->val>root->val){ if(!node1)node1=pre; node2=root; } pre=root; dfs(root->right); } };
class Solution { public: void recoverTree(TreeNode* root) { TreeNode*pre,*cur=root; TreeNode*node1=nullptr,*node2=nullptr,*last=nullptr; while(cur){ if(cur->left){ //找到pre //如果pre->right不存在说明是下降期,连接pre去下一个节点 //如果pre->right为cur说明是上升期,更新答案断开pre去下一个节点,当上升期结束正好去下一个节点是右子树 pre=cur->left; while(pre->right&&pre->right!=cur)pre=pre->right; if(!pre->right){ pre->right=cur; cur=cur->left; } else if(pre->right==cur){ if(last&&last->val>cur->val){ if(!node1)node1=last; node2=cur; } last=cur; pre->right=nullptr; cur=cur->right; } } //如果没有左孩子,说明需要更新答案通过上升箭头上升 else if(!cur->left){ if(last&&last->val>cur->val){ if(!node1)node1=last; node2=cur; } last=cur; cur=cur->right; } } int temp=node1->val; node1->val=node2->val; node2->val=temp; return; } };