leetcode 98. 验证二叉搜索树 递归遍历左右子树和中序遍历 c语言解法
如题:
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。示例 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语言解法相关推荐
- 【LeetCode笔记】98. 验证二叉搜索树(Java、dfs、中序遍历、二叉树)
文章目录 题目描述 代码 & 思路 题目描述 二叉搜索树,应该满足中序遍历的结果是按顺序的. 比如例1是1,2,3:而例二是1,5,3,4,6,是错的 代码 & 思路 就是中序遍历 + ...
- LeetCode 98. 验证二叉搜索树(递归)(迭代)
题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也 ...
- Leetcode 98:验证二叉搜索树
Leetcode 98:验证二叉搜索树 题目描述 我的解法:非递归的中序遍历 其它解法1:非递归的中序遍历,用LONG_MIN规避树的val等于INT_MIN的情况 其他解法2:递归的中序遍历思想 其 ...
- LeetCode 98. 验证二叉搜索树(中序遍历)
文章目录 1. 题目信息 2. 解题 2.1 递归中序 2.2 非递归中序 1. 题目信息 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于 ...
- leetcode —— 98. 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...
- LeetCode 98 验证二叉搜索树
题目链接:力扣 思路 递归 递归函数声明 bool isValidBST(TreeNode* root,int lower,int upper);//判断根节点是否在lower和upper之间 递归出 ...
- LeetCode 98. 验证二叉搜索树 思考分析
题目 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二 ...
- Leetcode 98. 验证二叉搜索树 (每日一题 20210810)
给定一个二叉树,判断其是否是一个有效的二叉搜索树.假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索树. ...
- leetcode - 98. 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...
最新文章
- VS2017 cout 不明确
- MySQL下优化SQL的一般步骤
- 王树彤IT美女七年磨一剑
- TextInputLayout-Android M新控件
- cordova打包安卓app
- ssh的详细链接过程
- Current HIVE_LIB is not valid, please export HIVE_LIB='YOUR_LOCAL_HIVE_LIB'
- 庖丁解Puppet之操作记实
- Excel中的fixed函数
- shell_study
- OCR文字识别软件那个好?
- QCC高通烧录驱动安装方法
- 华为2019网络挑战赛初赛网络方向部分模拟题及答案
- 机器学习 简答题 速记
- 隧道人员定位解决方案
- bzoj 4763: 雪辉
- python hasattr函数_Python hasattr()函数
- 安卓手机可以连接斑马系统吗_安卓手机与carplay互联,安卓手机怎么连carplay
- Mysql 增加表注释
- iphone原彩显示对眼睛好吗_iPhone x手机原彩显示烧屏怎么办呢
热门文章
- Spring(四)Bean注入方试
- hibernate配置之property name=hbm2ddl.autocreate/property导致每次创建SessionFactory都清空数据库中的数据...
- 坚强生活(转)--To 小鱼,妹妹和傻女孩们
- bat 安装mysql_免安装版Mysql一键部署bat文档的方法
- c mysql insert语句_MySQL_mysql insert详细讲解,INSERT语法
INSERT [LOW_PRIORITY |DELA - phpStudy...
- jmeter中没有sampler_jmeter(七)-BeanShell常用内置变量和场景
- 【Leetcode | easy】有效的括号
- 8.3 算法流程与评估-机器学习笔记-斯坦福吴恩达教授
- Android Log等级的介绍
- Android system server之WindowManagerService按键消息传播流程