一个二叉排序树的某两个节点颠倒了为了,去恢复它。
不可思议的是这道题居然被标记为了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; } }
Leetcode---Recover Binary Search Tree
原文地址:http://blog.csdn.net/ffmpeg4976/article/details/44903671