226. 翻转二叉树
翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
struct TreeNode* invertTree(struct TreeNode* root){
if(root == NULL) {
return NULL;
} //终止条件
struct TreeNode *temp = root->left;
root->left = root->right;
root->right = temp;
// 交换左右子树
invertTree(root->left); //递归交换左子树
invertTree(root->right); //递归交换右子树
return root;
}
98. 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
验证二叉搜索树
递归
bool recursive(struct TreeNode *root, long low, long high) {
if(root == NULL) return true;
long val = root->val;
if(val <= low || val >= high) {
return false;
} //判断根结点
return recursive(root->left, low, val) && recursive(root->right, val, high); //递归左子树右子树,更新上下界值
}
bool isValidBST(struct TreeNode* root){
return recursive(root, LONG_MIN, LONG_MAX);
}
INT_MAX:int类型的最大值 INT_MIN:int类型的最小值
long类型防止INT_MAX溢出
中序遍历
使二叉搜索树从小到大排列
bool inorder(struct TreeNode *root, struct TreeNode **pre) {
if(root == NULL) {
return true;
}
if(!inorder(root->left, pre)) {
return false;
}
if(*pre != NULL && root->val <= (*pre)->val) {
return false;
}
*pre = root;
return inorder(root->right, pre);
}
bool isValidBST(struct TreeNode* root){
struct TreeNode *pre = NULL;
return inorder(root, &pre);
}