力扣面试题 33 - 合法二叉搜索树

题目:

实现一个函数,检查一棵二叉树是否为二叉搜索树。

示例 1:

复制代码
输入:
    2
   / \
  1   3
输出:true

示例 2:

复制代码
输入:
    5
   / \
  1   4
     / \
    3   6
输出:false
解释:输入为: [5,1,4,null,null,3,6]。
     根节点的值为 5 ,但是其右子节点值为 4 。

思路:

  1. 首先你需要知道什么是二叉搜索树。CSDN可以自行搜索,这里不赘述。
  2. 二叉搜索树有一个特性,中序遍历二叉搜索树,其得到的序列一定是升序的。
  3. 利用这个特性,我们可以判断该树是否是二叉搜索树。
  4. 先对树进行中序遍历,得到一个数组。
  5. 判断数组是否升序,不是即不为二叉搜索树。

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)。

相关推荐
白狐_79829 分钟前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2581 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记1 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
qq_448011161 小时前
C语言中的动态内存分配
c语言·开发语言·php
杨航 AI1 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型2 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
动词ing2 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习
旖旎夜光2 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
叠层归一研究院3 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
小雨笙笙4 小时前
C语言:变量三属性——存储类型
c语言·开发语言