99. 恢复二叉搜索树
99. 恢复二叉搜索树
给你二叉搜索树的根节点 root
,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。
示例 1:
输入:root = [1,3,null,null,2]
输出:[3,1,null,null,2]
解释:3 不能是 1 的左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。
示例 2:
输入:root = [3,1,4,null,null,2]
输出:[2,1,4,null,null,3]
解释:2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。
提示:
- 树上节点的数目在范围
[2, 1000]
内 -231 <= Node.val <= 231 - 1
进阶:使用 O(n)
空间复杂度的解法很容易实现。你能想出一个只使用 O(1)
空间的解决方案吗?
思路: 二叉搜索树的特性在于中序遍历的升序的,所以只要利用这一点,找出错误的两个数调换位置即可。
class Solution {
public:
TreeNode* first=nullptr;
TreeNode* second=nullptr;
TreeNode* prev=new TreeNode(INT_MIN);
void recoverTree(TreeNode* root) {
//遍历 找出值位置错误的点
inorderTraverse(root);
int temp=first->val;
first->val=second->val;
second->val=temp;
}
void inorderTraverse(TreeNode* root){
//终止条件
if(root==nullptr){
return;
}
inorderTraverse(root->left);
//中序遍历
if(root->val<prev->val){
//root不符合有序性
if(first==nullptr){
//第一个错位节点是prev
first=prev;
}
//第二个错位节点是second
second=root;
}
prev=root;
inorderTraverse(root->right);
}
};
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16128672.html