一个二叉排序树的某两个节点颠倒了为了,去恢复它。
不可思议的是这道题居然被标记为了hard,其实难度远低于其他的hard或medium。
思路:中序遍历,然后看是不是递增的,如果不是,记录下来。注意,可能有一次逆序,也可能有两次,一次的发生在相邻节点。
注意,中序遍历是这样的:
void f(node * root){
if(root==NULL)
return;
f(root->left);
cout<<root->val<<endl;
f(root->right);
}
代码:
TreeNode *mistake1, *mistake2;;
TreeNode *pre;
void recursive_traversal(TreeNode*root) {
if(root==NULL) {
return;
}
recursive_traversal(root->left);
if(pre!=NULL&&root->val<pre->val) {
if(mistake1==NULL) {
mistake1 = pre;
mistake2 = root;
} else {
mistake2 = root;
}
}
pre = root;
recursive_traversal(root->right);
}
void recoverTree(TreeNode *root) {
recursive_traversal(root);
if(mistake1!=NULL&&mistake2!=NULL) {
int tmp = mistake1->val;
mistake1->val = mistake2->val;
mistake2->val = tmp;
}
}