题目描述
二叉搜索树(BST)中的两个节点被错误地交换了,
请在不改变树的结构的情况下恢复这棵树。
备注;
用O(n)的空间解决这个问题的方法太暴力了,你能设计一个常数级空间复杂度的算法么?
示例 1:
输入: [1,3,null,null,2]
1
/
3
2
输出: [3,1,null,null,2]
3
/
1
2
说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
typedef TreeNode Node;
class Solution {
public:
void recoverTree(TreeNode *root) {
pre=a=b=NULL;
dfs(root);
if(a&& b && a->val > b->val) swap(a->val,b->val);
}
Node* pre=NULL,* a=NULL,* b=NULL;
void dfs(Node* root) {
if(root==NULL) return;
dfs(root->left);
if(pre) {
if(pre->val > root->val) {
if(!a) a = pre;
b = root;
}
}
pre = root;
dfs(root->right);
}
};
判断二叉树
判断给出的二叉树是否是一个二叉搜索树(BST)
二叉搜索树的定义如下
一个节点的左子树上节点的值都小于自身的节点值
一个节点的右子树上节点的值都大于自身的节点值
所有节点的左右子树都必须是二叉搜索树
如果你不清楚“{1,#,2,3}"的含义的话,请继续阅读
我们用如下方法将二叉树序列化:
二叉树的序列化遵循层序遍历的原则,”#“代表该位置是一条路径的终结,下面不再存在结点。
typedef TreeNode Node;
class Solution {
public:
/**
*
* @param root TreeNode类
* @return bool布尔型
*/
bool isValidBST(TreeNode* root) {
bool isBST=true;
Node* pre =NULL;
return dfs(pre,isBST,root),isBST;
}
void dfs(Node* & pre,bool &isBST,Node* root) {
if(root==NULL) return;
dfs(pre,isBST,root->left);
if(pre) {
if(pre->val >= root->val)
{
isBST = false;
return;
}
}
pre = root;
dfs(pre,isBST,root->right);
}
};