判断一颗二叉树是否为二叉搜索树
首先定义一个二叉树的结构体
struct BinaryTree { int value; BinaryTree* lson; BinaryTree* rson; };
- 第一种方法
int maxOf(BinaryTree* root) { if (root->rson) { return maxOf(root->rson); } return root->value; } int minOf(BinaryTree* root) { if (root->lson) { return maxOf(root->lson); } return root->value; } bool check(BinaryTree* root) { if (root == NULL) { return true; } // 如果左子树的最大值小于当前节点值并且右子树的最小值大于当前节点的值并且左右子树都是二叉搜索树,则返回true,否则返回false; if (root->lson != NULL && maxOf(root->lson) >= root->value) { return false; } if (root->rson != NULL && minOf(root->rson) <= root->value) { return false; } return check(root->lson) && check(root->rson); }
这里有一个误区:
// 错误代码 bool check(BinaryTree* root) { if (root == NULL) { return true; } if (root->lson != NULL && root->lson->value >= root->value) { return false; } if (root->rson != NULL && root->rson->value <= root->value) { return false; } return check(root->lson) && check(root->rson); }
反正我一开始是这样想的,所以注意一下上面这种错误写法。
- 第二种方法
int max = -2147483648; bool check(BinaryTree* root) { if (root == NULL) { return true; } if (!check(root->lson)) { return false; } if (max >= root->value) { return false; } return check(root->rson); }
这个代码就是一个中序遍历,如果value递增,说明是一颗二叉搜索树,否则不是。当然max的初始值设置为-2147483648之后二叉树中就不能出现-2147483648,否则会出错。也可以把max类型改成long long之后用更小的数。