题目:
实现一个函数,检查一棵二叉树是否为二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出:true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出:false
解释:输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
思路:
- 首先你需要知道什么是二叉搜索树。CSDN可以自行搜索,这里不赘述。
- 二叉搜索树有一个特性,中序遍历二叉搜索树,其得到的序列一定是升序的。
- 利用这个特性,我们可以判断该树是否是二叉搜索树。
- 先对树进行中序遍历,得到一个数组。
- 判断数组是否升序,不是即不为二叉搜索树。
C语言代码如下:
cpp
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/* 中序遍历 */
void InorderTraverse(struct TreeNode* root, int* array, int* index){
if(root == NULL) return; // 递归终止条件
InorderTraverse(root->left, array, index);
array[(*index)++] = root->val; // 保存当前节点值,并更新索引
InorderTraverse(root->right, array, index);
}
/* 判断是否升序 */
bool isAscend(int* array, int length){
for(int i = 1; i < length; i++){
if(array[i] <= array[i - 1]) return false; // 升序判断
}
return true;
}
bool isValidBST(struct TreeNode* root) {
if(root == NULL) return true; // 空树也是有效的BST
// 假设树的节点数不会超过10000
int* array = (int*)malloc(10000 * sizeof(int));
if(array == NULL) return false; // 检查内存分配失败
int index = 0; // 中序遍历的索引
InorderTraverse(root, array, &index); // 获取中序遍历的结果
bool result = isAscend(array, index); // 检查中序遍历是否为升序
free(array); // 释放动态分配的内存
return result;
}
时间复杂度、空间复杂度均为O(N)。