前言
二叉排序树的判断,我一开始的想法是根据定义,每次判断左孩子<=根节点<=右孩子,但是写着写着发现不对,我当时的程序有一个这样致命的错误:
10
2 12
5 16
类似于这样的树也会被判断为正确。
要解决这个问题也不是不行,就是每次在判断的时候要顺带判断所有祖先节点,觉得有些麻烦。
正确的解决办法
利用二叉排序树的性质,数据结构课中讲过,对二叉排序树的中序遍历是一个有序数列,可以利用这个性质来判断,代码简洁优美。
#include <iostream>
using namespace std;
//中序遍历递增
bool isBSTree(BiTree root){
static int last = INT32_MIN;
if (root->lchild != NULL)
isBSTree(root->lchild);
if (root->data < last)//如果遍历的当前节点小于中序遍历中的上个节点(也就是应该小于等于当前节点的值)
return false;
last = root->data;
if (root->rchild != NULL)
isBSTree(root->rchild);
return true;
}