如题:

给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。示例 1:
输入:2/ \1   3
输出: true示例 2:
输入:5/ \1   4/ \3   6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。

这道题难度一般吧,根据二叉树的性质很容易得到解法,不过需要处理好细节。

解法1:二叉树性质,节点的左子树小于它,右子树都大于它。如果简单比较左右节点,特别容易出错。因为对于某个节点而言,除了满足和父节点的规律,还需满足整个子树的规律,因此需要存在上下边界。刚开始发现这个问题,没能解决上下界的处理,参考了官方题解后才分析清楚。

对于根节点而言,上下界同为NULL,
左节点的上界为父节点,下界继承父节点NULL;
右节点的下界为父节点,上界继承自父节点NULL; 使用指针可以避免考虑INT_MIN, INT_MAX整型边界问题

下面是c语言的解法:

bool checkBST(struct TreeNode *node, int *upper, int *lower)
{int ret = 1;if (upper && node->val >= *upper)return 0;if (lower && node->val <= *lower)return 0;//父节点传递和更新上下界if (node->left)ret *= checkBST(node->left, &node->val, lower);if (node->right)ret *= checkBST(node->right, upper, &node->val);return ret;
}
bool isValidBST(struct TreeNode* root){int ret = 1, *prev = NULL;if (!root)  return 1;//根节点上下界为NULL;return checkBST(root, NULL, NULL);
}

解法2:根据二叉树性质,二叉树的中序遍历得到有序序列,因此可以中序遍历二叉树,对于每一个节点,保存其前继节点的值,然后和当前节点比较即可。

下面是c语言解法:

//中序遍历
bool inOrderTraverse(struct TreeNode* root, int **prev)
{int ret = 1;//遍历左子树if (root->left)if (inOrderTraverse(root->left, prev) == 0)return 0;//中间节点if (*prev)if (root->val <= *(*prev))return 0;//更新前继节点*prev = &root->val;//遍历右子树if (root->right)if (inOrderTraverse(root->right, prev) == 0)return 0;return ret;
}bool isValidBST(struct TreeNode* root){int ret = 1, *prev = NULL;//特殊情况处理if (!root)  return 1;//解法2return inOrderTraverse(root, &prev);
}

参考资料:

=============================================================================================

Linux应用程序、内核、驱动、后台开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。

leetcode 98. 验证二叉搜索树 递归遍历左右子树和中序遍历 c语言解法相关推荐

  1. 【LeetCode笔记】98. 验证二叉搜索树(Java、dfs、中序遍历、二叉树)

    文章目录 题目描述 代码 & 思路 题目描述 二叉搜索树,应该满足中序遍历的结果是按顺序的. 比如例1是1,2,3:而例二是1,5,3,4,6,是错的 代码 & 思路 就是中序遍历 + ...

  2. LeetCode 98. 验证二叉搜索树(递归)(迭代)

    题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也 ...

  3. Leetcode 98:验证二叉搜索树

    Leetcode 98:验证二叉搜索树 题目描述 我的解法:非递归的中序遍历 其它解法1:非递归的中序遍历,用LONG_MIN规避树的val等于INT_MIN的情况 其他解法2:递归的中序遍历思想 其 ...

  4. LeetCode 98. 验证二叉搜索树(中序遍历)

    文章目录 1. 题目信息 2. 解题 2.1 递归中序 2.2 非递归中序 1. 题目信息 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于 ...

  5. leetcode —— 98. 验证二叉搜索树

    给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...

  6. LeetCode 98 验证二叉搜索树

    题目链接:力扣 思路 递归 递归函数声明 bool isValidBST(TreeNode* root,int lower,int upper);//判断根节点是否在lower和upper之间 递归出 ...

  7. LeetCode 98. 验证二叉搜索树 思考分析

    题目 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二 ...

  8. Leetcode 98. 验证二叉搜索树 (每日一题 20210810)

    给定一个二叉树,判断其是否是一个有效的二叉搜索树.假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索树. ...

  9. leetcode - 98. 验证二叉搜索树

    给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...

最新文章

  1. VS2017 cout 不明确
  2. MySQL下优化SQL的一般步骤
  3. 王树彤IT美女七年磨一剑
  4. TextInputLayout-Android M新控件
  5. cordova打包安卓app
  6. ssh的详细链接过程
  7. Current HIVE_LIB is not valid, please export HIVE_LIB='YOUR_LOCAL_HIVE_LIB'
  8. 庖丁解Puppet之操作记实
  9. Excel中的fixed函数
  10. shell_study
  11. OCR文字识别软件那个好?
  12. QCC高通烧录驱动安装方法
  13. 华为2019网络挑战赛初赛网络方向部分模拟题及答案
  14. 机器学习 简答题 速记
  15. 隧道人员定位解决方案
  16. bzoj 4763: 雪辉
  17. python hasattr函数_Python hasattr()函数
  18. 安卓手机可以连接斑马系统吗_安卓手机与carplay互联,安卓手机怎么连carplay
  19. Mysql 增加表注释
  20. iphone原彩显示对眼睛好吗_iPhone x手机原彩显示烧屏怎么办呢

热门文章

  1. Spring(四)Bean注入方试
  2. hibernate配置之property name=hbm2ddl.autocreate/property导致每次创建SessionFactory都清空数据库中的数据...
  3. 坚强生活(转)--To 小鱼,妹妹和傻女孩们
  4. bat 安装mysql_免安装版Mysql一键部署bat文档的方法
  5. c mysql insert语句_MySQL_mysql insert详细讲解,INSERT语法 INSERT [LOW_PRIORITY |DELA - phpStudy...
  6. jmeter中没有sampler_jmeter(七)-BeanShell常用内置变量和场景
  7. 【Leetcode | easy】有效的括号
  8. 8.3 算法流程与评估-机器学习笔记-斯坦福吴恩达教授
  9. Android Log等级的介绍
  10. Android system server之WindowManagerService按键消息传播流程