判断一颗二叉树是否为二叉搜索树(Validate Binary Search Tree)

一、学习要点:
利用二叉搜索树的中序遍历为递增数组的性质;
二、代码:

void middle(node* root,vector<int>& inorder)
{
	if(root==NULL)
	{
		return;
	}
	middle(root->left,inorder);
	inorder.push_back(root->value);
	middle(root->right,inorder);
}
bool isBST(node* root)
{
	vector<int> inorder;
	middle(root,inorder);
	for(int i=1;i<inorder.size();i++)
	{
		if(inorder[i-1]>=inorder[i])
		{
			return false;
		}
	}
	return true;
}
### 如何用C语言实现对二叉搜索树判断 在C语言中,可以通过递归方法或者迭代方法来验证一棵给定的二叉树是否满足二叉搜索树Binary Search Tree, BST)的特性。BST的核心属性在于:对于每一个节点而言,其左子树中的所有节点值均小于该节点值,而右子树中的所有节点值均大于该节点值。 #### 方法一:递归法 递归方法是最常见的解决方案之一。它通过维护一个范围 `[min_val, max_val]` 来确保每个节点都位于这个范围内。如果某个节点超出了允许的范围,则说明这不是一颗有效的BST[^1]。 以下是具体的代码实现: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构体 typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; int isValidBSTHelper(TreeNode* node, long min_val, long max_val) { if (node == NULL) return 1; // 如果到达叶子节点则返回true if ((long)node->val <= min_val || (long)node->val >= max_val) { return 0; // 节点超出有效范围 } // 对左右子树分别进行递归检测 if (!isValidBSTHelper(node->left, min_val, node->val)) return 0; if (!isValidBSTHelper(node->right, node->val, max_val)) return 0; return 1; // 所有条件均满足时返回true } int is_valid_bst(TreeNode* root) { return isValidBSTHelper(root, LONG_MIN, LONG_MAX); } ``` 此代码片段定义了一个辅助函数 `isValidBSTHelper()` ,用于递归地检查每棵子树是否符合BST的要求。 #### 方法二:中序遍历法 另一种常用的方法是利用 **中序遍历** 的特点——即如果按照从小到大的顺序访问整棵树的话,那么最终获得的结果应该是一个严格单调递增数列[^2]。因此,在执行过程中只需记录上一次访问过的数值并将其与当前正在处理的数据做对比即可完成校验工作。 下面是基于上述原理编写的程序版本: ```c static int prev_value = INT_MIN; static _Bool first_call = 1; _Bool check_inorder(TreeNode* node){ if(!node)return true; if(!check_inorder(node->left))return false; if(first_call){first_call=0;} else{ if(prev_value>=node->val)return false; } prev_value=node->val; if(!check_inorder(node->right))return false; return true; } _Bool validate_BST(TreeNode* root){ first_call=1; return check_inorder(root); } ``` 这里引入了两个静态变量 `_prev_value_` 和 `_first_call_` 分别用来存储先前遇到的最大值以及标记首次调用状态以便初始化这些全局量[^5]。 --- ### 总结 以上两种算法各有优劣之处。前者时间复杂度较低但空间消耗较大;后者虽然不需要额外开辟栈内存却可能因为频繁修改外部共享资源而导致线程安全性问题。实际应用当中应视具体情况选择合适的技术路线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值