您的位置:首页 > 其它

LeetCode: Recover Binary Search Tree

2013-04-20 02:52 363 查看
这题想了很久,看了网上答案,这段代码精髓在于findpos第一个pos是在他下一个node函数里才被发现的,因为第一个pos->val是变大了,所以p是pre,而第二个pos是在他自己本身的函数里被发现的,因为第二个pos->val是变小了,所以就是root。

/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void findpos(TreeNode *root, TreeNode * &pre, TreeNode * &p, TreeNode * &q) {
if (!root) return;
findpos(root->left, pre, p, q);
if (pre && pre->val > root->val) {
if (!p) p = pre;
q = root;
}
pre = root;
findpos(root->right, pre, p, q);
}
void recoverTree(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
TreeNode *p, *q, *pre;
pre = p = q = NULL;
findpos(root, pre, p, q);
int tmp = p->val;
p->val = q->val;
q->val = tmp;
}
};


C#

/**
* Definition for a binary tree node.
* public class TreeNode {
*     public int val;
*     public TreeNode left;
*     public TreeNode right;
*     public TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public void RecoverTree(TreeNode root) {
TreeNode p = null, q = null, pre = null;
findpos(root, ref pre, ref p, ref q);
int tmp = p.val;
p.val = q.val;
q.val = tmp;
}
public void findpos(TreeNode root, ref TreeNode pre, ref TreeNode p, ref TreeNode q) {
if (root == null) return;
findpos(root.left, ref pre, ref p, ref q);
if (pre != null && pre.val > root.val) {
if (p == null) p = pre;
q = root;
}
pre = root;
findpos(root.right, ref pre, ref p, ref q);
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: