判别二叉树是否为二叉排序树 -- C语言

算法

使用中序遍历的结果就是排序二叉树的排序输出(从小到大), 因此可以使用中序遍历 来实现判定二叉树是否为二叉排序树。

注意,不能用递归比较root和left,right的大小关系,因为left,right无法判断和root,root->parent, root->parent->parent等的大小关系

代码实现

bool isBSTree(st_trNode * root){
	if(NULL == root){
		printf("isBSTree param error\n");
		return PARAM_ERR;
	}

	bool rst = true, rst1 = false;
		
	/*递归结束条件*/
	if(NULL == root){
		return rst;
	}
	
	/*左子树*/
	if(NULL != root->left){
		rst1 = isBSTree(root->left);
		rst = rst & rst1;
	}

	if(g_lastvalue > root->data){
		return false;
	}
	g_lastvalue = root->data;

	/*右子树*/	
	if(NULL != root->right){
		rst1 = isBSTree(root->right);
		rst = rst & rst1;
	}
	
	return rst;
}

void testBSTree(void){

	printf("\n************  testBSTree ************ \n");

	st_trNode * p  = NULL;
	st_trNode * root = NULL;
	st_trNode * mostLeft = NULL;
	bool r
在C语言中,我们可以创建一个函数来判断一棵二叉树是否二叉排序树(BST)。BST的特点是对于每个节点,其左子树的所有节点值都小于该节点,而右子树的所有节点值都大于该节点。下面是一个递归的例子: ```c #include <stdio.h> #include <stdbool.h> // 定义二叉树节点结构体 typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 判断给定的二叉树是否为BST bool isBST(TreeNode* root) { if (root == NULL) { // 空树或者根节点为空都是BST return true; } // 左子树所有节点值应小于当前节点值 if (!isBST(root->left) || root->val <= root->left->val) { return false; } // 右子树所有节点值应大于当前节点值 if (!isBST(root->right) || root->val >= root->right->val) { return false; } // 如果以上条件都满足,则继续检查下一个节点 return true; } // 测试示例 int main() { // 创建一个简单的BST并测试isBST函数 TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = 4; root->left = (TreeNode*)malloc(sizeof(TreeNode)); root->left->val = 2; root->left->left = NULL; root->left->right = NULL; root->right = (TreeNode*)malloc(sizeof(TreeNode)); root->right->val = 6; root->right->left = (TreeNode*)malloc(sizeof(TreeNode)); root->right->left->val = 5; root->right->left->left = NULL; root->right->left->right = NULL; root->right->right = NULL; if (isBST(root)) { printf("The tree is a BST.\n"); } else { printf("The tree is not a BST.\n"); } free(root); return 0; }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值