题目分析:
- 判断一颗二叉树是否为二分查找树
解题思路:
中序遍历
二分查找树满足条件:左子树的值都比根节点小;右子树的值都比根节点大;左右子树必须满足这两个条件。
对于二分查找树,其中序遍历将得到一个有序的序列。故采用中序遍历实现。
递归求解
先判断根节点是否满足条件,然后分别递归判断左子树和右子树。
实现程序
方法1:中序遍历 //中序遍历 void InOrderTree(struct TreeNode *tree, vector<int> &result) { if (tree == NULL) return ; InOrderTree(tree->left, result); result.push_back(tree->val); InOrderTree(tree->right, result); } //判断一棵二叉树是否是二分查找树 bool isValidBTS(TreeNode *root) { vector<int> result; InOrderTree(root, result); // 判断中序遍历中是否存在逆序数 for (int i = 1; i < result.size(); i++) { if (result[i] <= result[i - 1]) return false; } return true; } // 递归实现 // 记录前一个节点 TreeNode *pre = NULL; bool isValidBTS1(struct TreeNode *root) { if (root != NULL) { // 递归左子树节点 if (!isValidBTS1(root->left)) return false; // 判断根节点是否满足条件 if (pre != NULL && root->val <= pre->val) return false; pre = root; // 递归右子树节点 return isValidBTS1(root->right); } return true; }