Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Note:confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.
Subscribe to see which companies asked this question
一棵二叉樹原本是二叉搜索樹,但是其中有兩個節點調換了位置,要求恢復原來的二叉搜索樹
//中序遍歷二叉樹,出現的節點的值會升序排序,如果有兩個節點位置錯了,那肯定會出現降序。
//設置一個pre節點指針,記錄當前節點中序遍歷時的前節點,如果當前節點小於pre節點的值,說明需要調整次序。
//如果在中序遍歷時節點值出現了兩次降序,第一個錯誤的節點為第一次降序時較大的節點,第二個錯誤節點為第二次降序時較小的節點。
//比如,原來的搜索二叉樹在中序遍歷的節點值依次為{1,2,3,4,5},如果因為兩個節點位置錯了而出現{1,5,3,4,2},
//第一次降序為5->3,所以第一個錯誤節點為5,第二次降序為4->2,所以第二個錯誤節點為2,將5和2換過來就可以恢復。
class Solution {
public:
TreeNode* mistake1;
TreeNode* mistake2;
TreeNode* pre=NULL;
void recoverTree(TreeNode* root) {
recursive_traversal(root);
if (mistake1 != NULL && mistake2 != NULL)
{
swap(mistake1->val, mistake2->val);
}
}
//遞歸中序遍歷二叉樹
void recursive_traversal(TreeNode* root){
if (root == NULL)
return;
if (root->left != NULL)
{
recursive_traversal(root->left);
}
if (pre != NULL && pre->val>root->val)
{
if (mistake1 == NULL)
{
mistake1 = pre;
mistake2 = root;
}
else
{
mistake2 = root;
}
}
pre = root;
if (root->right != NULL)
{
recursive_traversal(root->right);
}
}
};
