题目很短,简单来说就是有两个节点位置不对,你得把它们交换回来。那么如何做呢?
思路很简单,首先,得知道是哪两个节点吧。找到了需要交换的节点,节点值相互换一下不就好了。
有了思路,大致框架就可以写出来了。
public void recoverTree(TreeNode root) {
dfs(root);
int t=x.val;
x.val=y.val;
y.val=t;
}
dfs就是找节点的函数,关键是怎么找。
分情况找,假设正常树中序遍历为 12345
1.相邻的交换13245
2.不相邻的交换14325
剩下的都是细节的处理
附上全代码
class Solution {
TreeNode x,y,pre;
public void recoverTree(TreeNode root) {
dfs(root);
int t=x.val;
x.val=y.val;
y.val=t;
}
void dfs(TreeNode root){
if(root==null) return;
dfs(root.left);
//deal
if(pre!=null&&pre.val>root.val){
y=root;
if(x==null)
x=pre;
}
pre=root;
dfs(root.right);
}
}