質問の意味:あなたは任意の二つの要素が交換されるBSTを与え、あなたは回復の要素を交換できるようにします。
ソリューション:BSTの順序トラバーサルが整然と配列の中で、2つの要素が交換され、我々は、これら2つの数字のループを見つけることができます。maxの値を維持するために、小から大への横断は、素子を流れる電流の最大値を表します。二つの要素が交換されるので、その最大の期間がなければならないことが最大の要素より大きく、あなたが最大べきとの切り替え要素の最大の前になるように遭遇するまで、一定です。もちろん、最後はまだmaxよりも大きいを横断していない場合は、最大が最大であるので、上の最後の要素を入れ替えます。
上記のプロセスは、順トラバーサルで行うことができます。
C ++
`` `
/ **
- バイナリツリーノードの定義。
- 構造体のTreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
}。
* /
クラスソリューション{
パブリック:ツリーノード*最後。
ツリーノード*前。INTタグ= 0;
int型ANS = 0;INT、M = -123987523。
空recoverTree(TreeNodeの*ルート){if(root==NULL) return; last = new TreeNode(m); fun(root); if(ans==0) { int temp = pre->val; pre->val = last->val; last->val = temp; }
}
空の楽しみ(TreeNodeの*ルート)
{
場合(root->左= NULL!)
{
楽しい(root->左)。
}if(last->val == m ) { last=root; } else if(last->val<root->val) { if(tag==1) { int temp = pre->val; pre->val = last->val; last->val = temp; ans=1; } last=root; tag=0; } else { tag=1; } pre=root; if(root->right!=NULL) { fun(root->right); }
}
}。
`` `