Recover Binary Search Tree
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
互换二叉搜索树中两个位置错误的节点。
思路:
预设三个指针pre,p1,p2。p1用来指向第一个出错的节点,p2用来指向第二个出错的节点。
出错情况有两种,即p1和p2相邻,p1和p2不相邻。
中序遍历此二叉树,用pre指向当前节点的上一个节点,如果出错的节点相邻,此时p1应该指向pre,p2应该指向当前节点root。
若出错节点不相邻,则用p1记录第一个出错节点pre,继续遍历到前一个节点pre大于当前节点root时,用p2指向第二个出错节点p2.
代码如下:
class Solution { public: TreeNode *pre,*p1,*p2; void run(TreeNode *root){ if(!root) return; run(root->left); if(pre && pre->val > root->val){ if(p1 == NULL){ p1 = pre; p2 = root; } else{ p2 = root; } } pre = root; run(root->right); } void recoverTree(TreeNode *root) { if(!root) return ; pre = p1 = p2 = NULL; run(root); swap(p1->val,p2->val); } };