题目
实现一个函数,判断一棵二叉树是否为二叉查找树。
分析
我们知道一棵二叉查找树的中序遍历序列是有序的,所以只需求出中序遍历结果,再依次判断该序列是否有序即可。
但是上述方法需要额外线程空间保存遍历结果,在此可以省去该空间开销,只需一个变量保存访问当前节点时上一节点的值即可。
本文还提供了另一种方法,基于left<=current<right的特性上。
代码
/*
题目描述
请实现一个函数,检查一棵二叉树是否为二叉查找树。
给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树。
*/
#include <iostream>
#include <cstdlib>
#include <vector>
#include <queue>
using namespace std;
/*二叉树节点数据结构*/
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
const int flag = INT_MAX;
TreeNode *generateTree(vector<int> &nums)
{
if (nums.empty())
return NULL;
TreeNode *root = new TreeNode(nums[0]);
queue<T